Cognito OIDC预令牌Lambda无法添加用户组至令牌问题咨询
Cognito OIDC联合登录后预令牌Lambda无法修改用户组声明的问题
问题根因
Cognito的预令牌触发器(V2_0版本)默认不支持修改OIDC联合身份用户的cognito:groups声明,这和本地用户池用户的处理逻辑存在差异:
- 本地用户的
cognito:groups存储在用户池属性中,预令牌触发器可以直接通过groupsToOverride覆盖或添加组信息,修改会同步到访问令牌。 - OIDC联合身份用户的身份数据来自外部IdP,Cognito对这类用户的
cognito:groups有特殊处理逻辑:即使你在Lambda中修改了groupsToOverride,Cognito也不会将自定义组注入到OIDC登录生成的访问令牌中,因为联合身份的令牌声明优先级为「IdP断言 > Cognito用户池自定义修改」。另外,你代码中读取的event.request.userAttributes['cognito:groups']对于OIDC用户来说,并不会包含后续添加的用户组(这些组实际存储在身份池而非用户池属性中)。
解决方案
方案一:改用基于角色的权限控制(推荐)
将用户组与IAM角色绑定,通过身份池的角色映射规则实现权限控制,这是Cognito联合身份场景的标准权限方案:
- 在IAM中创建对应用户组的角色,配置好对应权限策略。
- 进入Cognito身份池的「角色映射」配置页面,设置规则:例如当用户属于指定用户组时,映射到对应的IAM角色。
- 联合登录后,Cognito生成的访问令牌会包含角色信息,后端可通过解析令牌中的角色字段进行权限校验。
方案二:自定义声明存储用户组信息
如果坚持使用用户组作为权限判断依据,可以绕过cognito:groups字段,添加自定义声明:
- 修改预令牌Lambda代码,将用户组信息写入自定义声明(如
custom:groups):
const userGroups = event.request.userAttributes['cognito:groups'] || []; event.response = { claimsAndScopeOverrideDetails: { claimsToAddOrOverride: { 'custom:groups': JSON.stringify([...userGroups, 'some-group']) } } }
- 在Cognito用户池的应用客户端设置中,开启自定义声明的权限,确保该字段能被包含在访问令牌内。
- 后端权限校验时,读取
custom:groups字段而非cognito:groups。
方案三:将OIDC用户同步到本地用户池
开启Cognito用户池的「自动创建用户池用户」功能,OIDC用户首次登录时会被创建为本地用户池用户,之后预令牌触发器的原有逻辑即可生效。但此方案会增加用户池用户数量,需考虑成本和数据同步问题。
内容的提问来源于stack exchange,提问作者supertux
相关产品推荐
相关产品推荐

