Auth.signIn返回Scope与AWS Cognito客户端配置不一致的解决方法
问题解决:Next.js中AWS Cognito Auth.signIn返回scope不符的问题
核心原因
Auth.signIn() 是Cognito用户池的本地用户名密码认证方式,返回的AccessToken是用户池专属令牌,默认scope固定为aws.cognito.signin.user.admin,这是Cognito的设计逻辑。你配置的email、openid属于OIDC(OpenID Connect)协议的scope,仅在OAuth2授权流程(如Hosted UI登录)中生效,或通过ID Token获取对应信息。
解决方案
方案1:改用Cognito Hosted UI登录(走OAuth授权流程)
如果需要直接获取包含配置scope的令牌,替换Auth.signIn()为Auth.federatedSignIn()触发Hosted UI,走OAuth授权码流程:
const handleSubmit = () => { // 跳转到Cognito托管登录页,自动遵循配置的OAuth scope Auth.federatedSignIn(); };
登录成功后,回调到你配置的redirectSignIn地址,此时获取的会话中:
- AccessToken会包含你配置的
email、openidscope - ID Token会携带对应scope的用户信息(如邮箱、用户ID等)
方案2:本地登录后从ID Token提取OIDC信息
如果坚持使用Auth.signIn()本地登录,可从用户会话的ID Token中获取openid、email对应的用户数据(ID Token的payload会包含这些scope声明的字段):
const handleSubmit = async (email, password) => { try { const user = await Auth.signIn(email, password); // 提取ID Token及其负载 const idToken = user.signInUserSession.idToken; console.log("ID Token 负载:", idToken.payload); // 直接获取邮箱等OIDC字段 console.log("用户邮箱:", idToken.payload.email); console.log("邮箱是否验证:", idToken.payload.email_verified); } catch (error) { console.log("登录失败:", error); } };
方案3:检查用户池客户端配置(兜底验证)
确认Cognito用户池客户端的以下配置:
- Allowed OAuth Flows 勾选
authorization_code(与你配置的responseType: "code"匹配) - Allowed OAuth Scopes 确实勾选了
openid和email - Enable ID Token 选项处于开启状态
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

