配置Cognito身份池后ID Token未显示cognito:preferred_role等附加声明怎么办
问题排查与缺失配置说明
核心认知纠正
cognito:preferred_role、cognito:roles 字段不会出现在Cognito用户池签发的ID Token中,这些是Cognito身份池(Identity Pool)接口返回的凭证附属字段,你不需要尝试在ID Token中查找这些声明。
你遗漏的配置项
- 身份池调用参数缺失:你需要在用户登录获取到用户池的ID Token后,主动调用身份池的
GetId、GetCredentialsForIdentity接口,并且在请求的Logins参数中按照要求传入ID Token,格式为cognito-idp.<region>.amazonaws.com/<你的用户池ID>: <用户登录返回的ID Token>。如果没有传入该参数,身份池会默认将用户识别为未认证身份,分配未认证角色。 - RoleMappings配置缺少匹配规则:你当前的
Token类型角色映射没有配置RulesConfiguration规则,身份池无法判断什么时候要给用户分配对应的认证角色,补充配置示例如下:
IdentityPoolRoleAttachment: Type: AWS::Cognito::IdentityPoolRoleAttachment Properties: IdentityPoolId: !Ref IdentityPool Roles: "authenticated": !GetAtt AuthenticatedRole.Arn "unauthenticated": !GetAtt UnAuthenticatedRole.Arn RoleMappings: "userpool1": IdentityProvider: !Join ['', ['cognito-idp.', !Ref 'AWS::Region', '.amazonaws.com/', !Ref UserPoolId, ':', !Ref UserPoolClientId]] AmbiguousRoleResolution: AuthenticatedRole Type: Token # 补充的规则配置 RulesConfiguration: Rules: # 示例规则:匹配ID Token中cognito:groups声明等于authenticated_user的用户,分配认证角色 - Claim: "cognito:groups" MatchType: "Equals" Value: "authenticated_user" RoleARN: !GetAtt AuthenticatedRole.Arn
- 用户池属性/组配置缺失:如果使用用户组作为角色映射的判断依据,需要确认对应用户已经被加入到匹配的Cognito用户组中;如果使用自定义用户属性作为匹配依据,需要在用户池的客户端属性读写权限中,开启对应属性的可读权限,保证属性会被写入ID Token。
- API Gateway授权逻辑调整:如果你需要基于身份池的角色调用AWS服务,不需要依赖API Gateway自动Assume角色,直接将用户池的ID Token透传给后端Lambda,在Lambda代码中调用
GetCredentialsForIdentity接口获取对应认证角色的临时AKSK,再用该临时凭证初始化DynamoDB SDK即可。 - 可选优化:如果不需要未认证用户访问你的服务,可以直接在身份池配置中关闭「允许未认证身份访问」开关,避免用户被错误分配未认证角色。
内容的提问来源于stack exchange,提问作者user48936
相关产品推荐
相关产品推荐

