使用谷歌ID令牌访问AWS Cognito身份池时触发NotAuthorizedException异常求助
嘿,我看了你的问题,碰到这个模糊的报错真的挺闹心——明明配置看起来都对,就是卡在身份验证这一步。结合你给出的令牌payload、代码细节,我帮你梳理几个高概率的排查点,你可以挨个试试:
1. 先检查谷歌云项目是否启用了Google+ API(这个坑很多人踩过)
AWS Cognito验证谷歌ID令牌的时候,会调用谷歌的API来校验令牌合法性,而这个操作依赖于谷歌云项目里的Google+ API是否启用。你可以登录谷歌云控制台,在API库搜“Google+ API”,确认它的状态是“已启用”。我之前碰到过完全一样的错误,最后就是因为这个API没开导致的。
2. 确认Cognito身份池的谷歌提供商是已启用状态
别笑,有时候配置完客户端ID,很容易忘了把谷歌身份提供商的开关打开!去Cognito身份池的「身份验证」标签页,找到谷歌提供商,确保它的状态是“已启用”,而不是仅仅填了客户端ID就完事。
3. 核对谷歌Web客户端ID的限制配置
去谷歌云控制台的OAuth 2.0客户端ID设置里,找到你用的那个Web客户端ID,检查这两个点:
- 「已授权的重定向URI」有没有添加Cognito的回调地址?格式是
https://<你的Cognito身份池区域>.amazoncognito.com/oauth2/idpresponse - 「应用限制」是不是设得太严?比如如果选了“已授权的JavaScript来源”,有没有把Cognito域名加进去?
4. 用AWS CLI直接测试令牌有效性
你可以绕开Android代码,用AWS CLI手动调用get-id命令,看看Cognito能不能正常识别你的令牌:
aws cognito-identity get-id --identity-pool-id "你的身份池ID" --logins "accounts.google.com=你的完整谷歌ID令牌"
如果CLI也报同样的错,那问题肯定出在Cognito配置或者谷歌令牌本身;如果CLI能成功拿到身份ID,那就是你Android代码里的Cognito客户端配置有问题(比如区域不对、权限不足)。
5. 检查Cognito身份池角色的权限
你的Android应用使用的Cognito身份池角色(未验证/已验证身份角色)有没有足够的权限调用GetId和GetCredentialsForIdentity?测试阶段可以先给角色加上AmazonCognitoIdentityFullAccess权限(生产环境记得收窄),看看是不是权限导致的验证失败。
我猜第一个排查点(Google+ API未启用)大概率能解决你的问题,毕竟这个是最容易被忽略的配置项,而且Cognito返回的错误信息又特别模糊。赶紧去试试吧!
内容来源于stack exchange

