如何通过Amplify客户端向AppSync GraphQL发送OIDC idToken进行认证
Amplify客户端调用AppSync OIDC认证的正确Token传递方式
你遇到的"No current user"错误,通常是因为Token传递的细节不符合Amplify客户端要求,或是认证上下文未正确关联。以下是两种正确的Token传递方式及排查要点:
一、单次调用时直接传递参数
你的代码核心逻辑没问题,但需注意几个细节:
authMode必须严格为"OPENID_CONNECT"(全大写)authToken需传入有效的OIDC ID Token,确保Token未过期、签名及Claims(如iss、aud)与AppSync配置的OIDC提供者匹配- 检查代码语法完整性,你提供的示例末尾缺少闭合括号,会导致执行异常
修正后的完整代码:
const todoData = await API.graphql({ query: createRoom, variables: { advertiser_name: 'test2' }, authMode: 'OPENID_CONNECT', authToken: '你的有效OIDC ID Token' });
二、全局配置认证上下文(推荐)
如果需要多次调用API,建议全局配置OIDC认证,避免重复传递参数:
1. 初始化Amplify时配置OIDC提供者
import Amplify from 'aws-amplify'; import awsconfig from './aws-exports'; Amplify.configure({ ...awsconfig, Auth: { oauth: { domain: '你的OIDC身份提供者域名', scope: ['openid', 'email', 'profile'], redirectSignIn: '你的前端回调地址', redirectSignOut: '你的前端退出回调地址', responseType: 'id_token' } } });
2. 手动注入已获取的Token
如果是自行从OIDC提供者获取Token,可通过以下方式注入到Amplify的认证上下文,后续API调用无需再指定认证参数:
import { Auth } from 'aws-amplify'; // 注入Token,expires_at为Token的过期时间(毫秒级时间戳) Auth.federatedSignIn({ token: '你的有效OIDC ID Token', expires_at: Date.now() + 3600 * 1000 // 示例为1小时后过期,需根据实际Token的exp字段调整 }); // 后续调用API无需再传authMode和authToken const todoData = await API.graphql({ query: createRoom, variables: { advertiser_name: 'test2' } });
常见排查要点
- 验证Token有效性:用JWT解码工具检查Token的
exp(过期时间)、iss(签发者)、aud(受众)是否与AppSync的OIDC配置一致 - 确认AppSync配置:检查AppSync控制台的认证设置中,OIDC提供者的URL、客户端ID等参数是否正确
- 检查CORS配置:确保AppSync的CORS规则允许前端域名访问,避免请求中Token被拦截
- 核对Amplify版本:不同版本的Amplify客户端API可能存在参数差异,建议使用最新稳定版
内容的提问来源于stack exchange,提问作者parrado
相关产品推荐
相关产品推荐

