AWS Cognito重定向回URL时无法找到RefreshToken的问题
我之前也碰到过一模一样的情况,这其实是Cognito不同授权流程的设计差异导致的,咱们来拆解一下问题和解决办法:
问题本质
你通过aws cognito-idp admin-initiate-auth命令用ADMIN_NO_SRP_AUTH流程能拿到三种Token,是因为这个流程属于服务端到服务端的认证模式,Cognito会返回完整的身份凭证包。但你用托管登录页时指定的response_type=token走的是隐式授权流程——这个流程是专门给纯前端应用设计的,出于安全考量,本身就不会下发RefreshToken。
具体解决步骤
1. 切换授权流程类型
把登录URL里的response_type从token改成code,也就是采用授权码流程(Authorization Code Flow),修改后的URL示例:
https://test-cognito.auth.us-east-1.amazoncognito.com/login?response_type=code&client_id=你的客户端ID&redirect_uri=你的自定义重定向URL&scope=openid+profile+email
划重点:必须包含
openid这个scope,这是Cognito返回RefreshToken的必要前提。
2. 检查应用客户端配置
登录AWS控制台,进入你的Cognito用户池 → 应用集成 → 应用客户端,确认以下设置:
- 已勾选允许授权码流(Authorization Code Grant)
- 在「生成的令牌」区域,确认RefreshToken的生成开关是开启状态(默认开启,但建议核实)
- 你的自定义重定向URL已经添加到「已批准的重定向URI」列表中
3. 用授权码换取完整Token
用户完成登录后,Cognito会重定向到你的自定义URL,并携带code参数。你需要在后端用这个code调用Cognito的token端点来换取包含RefreshToken的完整凭证,示例命令:
curl --request POST \ --url https://test-cognito.auth.us-east-1.amazoncognito.com/oauth2/token \ --header 'content-type: application/x-www-form-urlencoded' \ --data grant_type=authorization_code \ --data client_id=你的客户端ID \ --data client_secret=你的客户端密钥(如果有设置的话) \ --data code=重定向返回的授权码 \ --data redirect_uri=你的自定义重定向URL
提示:如果你的应用客户端没有设置密钥,就不需要传
client_secret参数。
额外建议
如果你的场景是纯前端应用,不想暴露客户端密钥,可以用**授权码流程+PKCE(Proof Key for Code Exchange)**的组合,这是更安全的前端方案,同样能获取到RefreshToken,而且不需要存储敏感的客户端密钥。
内容的提问来源于stack exchange,提问作者Mehran

