AWS Cognito通过Google认证后如何获取refresh token并维持用户认证?
解决方案:通过Google身份提供商获取Cognito Refresh Token并维持用户认证
你遇到的核心问题是当前使用的隐式授权流(Implicit Flow)不会返回refresh token,只要切换为授权码流(Authorization Code Flow),就能让Cognito在Google认证后生成并返回refresh token,从而实现长期维持用户认证。
1. 修改登录请求参数
将你当前的登录URL从隐式流改为授权码流,关键参数调整如下:
https://{DOMAIN_NAME}.auth.{REGION}.amazoncognito.com/login?response_type=code&client_id={CLIENT_ID}&redirect_uri=http://localhost:5000/&scope=openid+profile+email
- 把
response_type=token替换为response_type=code - 必须添加
scope参数,至少包含openid,额外可按需添加profile、email获取用户基础信息
2. 配置Cognito用户池客户端
确保你的用户池客户端满足以下配置:
- 在Cognito控制台的用户池客户端设置中,勾选允许授权码流
- 确认生成refresh token选项已启用(默认启用,建议检查)
- 验证
http://localhost:5000/已添加到客户端的「允许回调URL」列表中
3. 用授权码换取完整令牌集
用户通过Google认证后,Cognito会将授权码(code)重定向到你的回调地址。后端需要用这个授权码向Cognito令牌端点发起POST请求,换取包含refresh token的完整令牌:
POST https://{DOMAIN_NAME}.auth.{REGION}.amazoncognito.com/oauth2/token Content-Type: application/x-www-form-urlencoded grant_type=authorization_code&client_id={CLIENT_ID}&code={AUTHORIZATION_CODE}&redirect_uri=http://localhost:5000/
如果你的用户池客户端设置了密钥,需额外添加client_secret={CLIENT_SECRET}参数
4. 维持用户认证的流程
拿到refresh token后,后续的令牌刷新逻辑和普通Cognito用户完全一致:
- 当id token或access token过期时,用refresh token向Cognito请求新令牌:
POST https://{DOMAIN_NAME}.auth.{REGION}.amazoncognito.com/oauth2/token Content-Type: application/x-www-form-urlencoded grant_type=refresh_token&client_id={CLIENT_ID}&refresh_token={REFRESH_TOKEN}
- 注意:refresh token默认有效期为30天,过期后需要用户重新登录
额外说明
- 隐式授权流适合纯前端无后端的场景,但安全性较低且无refresh token支持;授权码流更适合有后端的应用,安全性更高且支持长期认证维持
- 确保Google作为身份提供商在Cognito中的配置正确,已完成OpenID Connect的客户端ID、密钥等信息配置
内容的提问来源于stack exchange,提问作者Sarath
相关产品推荐
相关产品推荐

