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

AWS Amplify切换responseType为code后,如何用授权码获取令牌?

AWS Amplify授权码(code)模式下获取令牌完整流程指导

背景与问题

之前将Amplify Auth的responseType设为token时,能完成Microsoft SSO登录并获取AccessToken/IdToken,但始终拿不到refreshToken。切换到code模式后,已成功获取授权码code,但不清楚如何用该code兑换accessToken、IdToken和refreshToken。

当前Amplify配置:

Amplify.configure({
  Auth: {
    region: config.aws.region,
    identityPoolRegion: config.aws.region,
    userPoolId: process.env.userPoolId,
    userPoolWebClientId: process.env.appClientId,
    oauth: {
      domain: process.env.domain,
      redirectSignIn: `${process.env.redirectSignIn}`,
      redirectSignOut: process.env.redirectSignout,
      responseType: 'code' // 注意:此处需改为字符串类型,原代码未加引号会报错
    }
  }
});

当前登录触发逻辑:

const azureLogin = () => {
  window.location.href = `https://${process.env.domain}/oauth2/authorize?identity_provider=${process.env.identityProviderName}&redirect_uri=${process.env.redirectSignIn}&response_type=${process.env.responseType}&client_id=${process.env.appClientId}&scope=aws.cognito.signin.user.admin+email+openid+phone+profile`;
};

登录后已成功跳转到重定向URL并拿到code参数,但不知后续流程。

完整解决方案流程

1. 修正Amplify配置的关键细节

首先确保oauth.responseType是字符串类型(原代码中code未加引号,会被当作变量解析导致错误),修正为'code'。

2. 在重定向页面中让Amplify自动处理授权码兑换

不需要手动调用Cognito的token端点,Amplify Auth模块内置了处理逻辑。在你的重定向页面(比如/auth/redirect)中添加以下代码:

import { Auth } from 'aws-amplify';
import { useEffect } from 'react'; // 非React框架可调整为对应生命周期逻辑

// 重定向页面的组件逻辑
const AuthRedirect = () => {
  useEffect(() => {
    const exchangeCodeForTokens = async () => {
      try {
        // 让Amplify自动检测URL中的code并完成令牌兑换
        const user = await Auth.currentAuthenticatedUser({ bypassCache: true });
        
        // 获取完整会话信息,包含所有令牌
        const session = await Auth.currentSession();
        
        // 提取所需令牌
        const accessToken = session.getAccessToken().getJwtToken();
        const idToken = session.getIdToken().getJwtToken();
        const refreshToken = session.getRefreshToken().getToken();
        
        console.log('获取到的令牌:', { accessToken, idToken, refreshToken });
        
        // 令牌获取成功后,跳转到应用主页或其他业务页面
        window.location.href = '/';
      } catch (error) {
        console.error('令牌兑换失败:', error);
        // 处理错误,比如跳转到登录页
      }
    };

    exchangeCodeForTokens();
  }, []);

  return <div>正在处理登录...</div>;
};

export default AuthRedirect;

3. 关键原理说明

Amplify Auth会自动监听重定向URL中的code参数,然后调用Cognito的/oauth2/token端点完成授权码兑换,兑换成功后会将accessToken、IdToken和refreshToken存储在本地存储(如localStorage或Cookie)中,后续可通过Auth.currentSession()随时获取。

4. 必要的Cognito客户端配置检查

确保你的Cognito用户池客户端满足以下要求:

  • 在"App client settings"中,勾选Authorization code grant授权类型
  • 正确配置了Callback URL(s)和Sign out URL(s),与Amplify配置中的redirectSignIn/redirectSignOut一致
  • 启用了Microsoft作为身份提供商,并在客户端设置中勾选该身份提供商

内容的提问来源于stack exchange,提问作者micronyks

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 11:11:33