AWS Cognito调用AssumeRoleWithWebIdentity报错:缺失aud声明
解决AssumeRoleWithWebIdentity报错"Invalid login token. Missing a required claim: aud"
这个问题我之前帮不少开发者排查过,核心原因要么是用错了Cognito返回的令牌类型,要么是IAM角色的信任策略配置不匹配。咱们一步步来解决:
1. 务必使用Cognito的ID Token而非Access Token
你现在传入的是Cognito的Access Token,但STS的AssumeRoleWithWebIdentity API要求的是ID Token。这两者的aud(受众)声明完全不同:
- Access Token的
aud是你的Cognito用户池ID(格式类似arn:aws:cognito-idp:us-east-1:1234567890:userpool/us-east-1_XXXXXXX),不符合STS的校验要求; - ID Token的
aud是你在Cognito用户池中创建的客户端ID,这才是STS期望的受众值。
所以第一步,把API调用里的WebIdentityToken参数替换成Cognito认证后返回的ID Token值。
2. 检查IAM角色的信任策略配置
确保你的跨账号角色(arn:aws:iam::id:role/_cross_account_role)的信任策略允许来自Cognito的身份认证,并且条件匹配正确的aud值。
示例信任策略(针对Cognito身份池)
如果是通过Cognito身份池中转认证,信任策略应该配置成这样:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Federated": "cognito-identity.amazonaws.com" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "cognito-identity.amazonaws.com:aud": "你的Cognito身份池ID" }, "ForAnyValue:StringLike": { "cognito-identity.amazonaws.com:amr": "authenticated" } } } ] }
示例信任策略(直接使用Cognito用户池作为身份提供商)
如果直接用用户池作为身份源,信任策略要指向用户池ARN,并校验客户端ID:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Federated": "arn:aws:cognito-idp:你的区域:你的账号ID:userpool/你的用户池ID" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "arn:aws:cognito-idp:你的区域:你的账号ID:userpool/你的用户池ID:aud": "你的Cognito用户池客户端ID" } } } ] }
3. 验证JWT的aud声明
你可以用本地工具(比如jwt命令行工具)解码令牌,确认aud字段是否符合要求。比如执行:
jwt decode 你的ID_TOKEN值
查看输出中的aud字段,确保它和你信任策略里配置的客户端ID/身份池ID完全一致。
如果以上步骤都完成后还是报错,建议检查令牌的exp字段是否过期,或者确认你的服务器环境能正常访问Cognito的公钥端点(用于验证令牌签名):https://cognito-idp.{你的区域}.amazonaws.com/{你的用户池ID}/.well-known/jwks.json
内容的提问来源于stack exchange,提问作者Nirojan Selvanathan
相关产品推荐
相关产品推荐

