Amazon Cognito集成Google登录无法映射Refresh Token求助
我之前也碰到过一模一样的问题!看起来你的Cognito和Google基础配置都没问题(毕竟access_token和其他字段都能正常映射),核心问题大概率出在Google OAuth的授权参数设置上——因为Google默认不会随便返回refresh_token,得满足特定条件才行。
1. 必须设置access_type=offline让Google返回refresh_token
Google OAuth 2.0中,只有当你明确指定access_type=offline时,才会在授权响应里包含refresh_token。Cognito默认不会添加这个参数,所以你需要手动在Google身份提供者的配置里补上:
- 打开Cognito控制台,进入你的用户池 → 身份提供者 → 选中Google → 点击「编辑」
- 滚动到「初始化设置」的「自定义参数」区域,点击「添加自定义参数」
- 键填
access_type,值填offline,保存配置
2. 首次授权后重复登录不会返回新的refresh_token(测试时可强制重新授权)
如果用户之前已经完成过授权,即使你设置了access_type=offline,Google也不会再返回refresh_token。这时候可以临时添加approval_prompt=force参数强制用户重新授权,这样就能拿到refresh_token了:
- 同样在Google身份提供者的自定义参数里添加:键
approval_prompt,值force - 注意:这个参数只适合测试场景,生产环境建议移除或设为
auto,否则每次登录都要用户重新授权,体验很差
3. 最后再核对两个细节
- 确认Cognito用户池的
google_refresh_token属性是可写的:进入用户池 → 属性 → 自定义属性,检查该字段的「可写」选项是否勾选 - 检查Google Cloud Console里的OAuth客户端:确保重定向URI和Cognito里配置的完全一致(包括http/https、域名、路径),而且客户端ID/密钥没有填错
测试验证
修改配置后,让用户(或者你用测试账号)重新走登录流程:如果是第一次授权,或者用了approval_prompt=force,登录完成后去Cognito控制台查看用户属性,应该就能看到google_refresh_token有值了。
如果还是不行,可以去Cognito的CloudWatch日志里排查授权流程的细节,看看Google返回的响应里到底有没有refresh_token——如果Google没返回,那问题还是在Google的配置;如果返回了但Cognito没映射,再检查属性映射的源字段是不是refresh_token(别写错字段名)。
内容的提问来源于stack exchange,提问作者Madhav Chaturvedi

