安卓APP调用AWS Lambda时,AWS Cognito联合身份认证失败
解决AWS Cognito联合身份认证失败(用户未通过身份验证)问题
我之前帮不少开发者排查过类似的Cognito联合身份认证问题,结合你提到的工作流和报错,下面是几个最常见的排查方向,你可以逐一验证:
1. 检查身份池的基础配置
- 先确认Cognito控制台里的身份池已经启用了Google+、Facebook等对应登录提供商,并且填写的客户端ID/应用ID完全正确——比如Facebook需要把安卓应用的哈希值同步到Facebook开发者后台,Google要确保OAuth 2.0客户端ID的包名、签名指纹和你的安卓应用完全匹配。
- 核实身份池的未认证/已认证角色都已正确创建,且角色具备调用Lambda的权限(比如添加
lambda:InvokeFunction的权限策略)。
2. 验证GetId步骤的参数准确性
调用GetId时最容易踩坑:
IdentityPoolId必须完全正确,格式是region:xxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx,别漏写区域或打错字符。- 如果是已认证用户,
Logins参数的格式要严格遵循Cognito要求:比如Facebook是{"graph.facebook.com": "你的Facebook访问令牌"},Google是{"accounts.google.com": "你的Google ID令牌"},这里的提供商域名不能写错。 - 如果测试未认证用户,要确保身份池的“允许未认证身份”选项已勾选。
3. 确认流程衔接的参数一致性
- 调用
GetOpenIdToken时,必须使用GetId返回的IdentityId,且如果是已认证用户,Logins参数要和GetId时完全一致。 - 调用
AssumeRoleWithWebIdentity时,WebIdentityToken必须是GetOpenIdToken返回的OpenIdToken,RoleArn要和身份池配置的对应角色ARN一致,RoleSessionName填一个唯一值即可(比如用户ID或随机UUID)。
4. 排查第三方令牌的有效性
第三方登录令牌无效是常见诱因:
- 单独验证Facebook/Google令牌:比如用Facebook的调试工具检查access token是否过期、权限是否符合要求;Google的ID令牌可以解码后确认
aud(受众)是你的应用客户端ID、exp(过期时间)未到。 - 如果令牌无效,Cognito会直接返回身份验证失败,这时候需要重新引导用户获取有效的第三方令牌。
5. 检查IAM角色的信任关系
确保身份池对应角色的信任策略配置正确:
- 已认证角色的信任策略应该包含:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Federated": "cognito-identity.amazonaws.com" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "cognito-identity.amazonaws.com:aud": "你的身份池ID" }, "ForAnyValue:StringLike": { "cognito-identity.amazonaws.com:amr": "authenticated" } } } ] }
- 未认证角色的
amr值要改成unauthenticated。
6. 用CloudTrail日志定位细节
如果以上步骤都没问题,去AWS CloudTrail里搜索GetId、GetOpenIdToken、AssumeRoleWithWebIdentity的调用记录,里面会有具体的错误原因(比如参数错误、权限不足、令牌无效等),这是精准定位问题的关键。
内容的提问来源于stack exchange,提问作者mipnw
相关产品推荐
相关产品推荐

