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
相关产品推荐
相关产品推荐

