You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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联合身份场景的标准权限方案:

  1. 在IAM中创建对应用户组的角色,配置好对应权限策略。
  2. 进入Cognito身份池的「角色映射」配置页面,设置规则:例如当用户属于指定用户组时,映射到对应的IAM角色。
  3. 联合登录后,Cognito生成的访问令牌会包含角色信息,后端可通过解析令牌中的角色字段进行权限校验。

方案二:自定义声明存储用户组信息

如果坚持使用用户组作为权限判断依据,可以绕过cognito:groups字段,添加自定义声明:

  1. 修改预令牌Lambda代码,将用户组信息写入自定义声明(如custom:groups):
const userGroups = event.request.userAttributes['cognito:groups'] || [];
event.response = {
    claimsAndScopeOverrideDetails: {
        claimsToAddOrOverride: {
            'custom:groups': JSON.stringify([...userGroups, 'some-group'])
        }
    }
}
  1. 在Cognito用户池的应用客户端设置中,开启自定义声明的权限,确保该字段能被包含在访问令牌内。
  2. 后端权限校验时,读取custom:groups字段而非cognito:groups。

方案三:将OIDC用户同步到本地用户池

开启Cognito用户池的「自动创建用户池用户」功能,OIDC用户首次登录时会被创建为本地用户池用户,之后预令牌触发器的原有逻辑即可生效。但此方案会增加用户池用户数量,需考虑成本和数据同步问题。

内容的提问来源于stack exchange,提问作者supertux

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 02:52:31