You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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、openid scope
  • 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 21:51:16