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

如何通过单个App Client为不同Cognito用户配置差异化API Gateway权限?

解决方案:根据用户类型动态分配Cognito Access Token Scope

你遇到的这个场景确实是Cognito Hosted UI的常见痛点——默认只能用预先配置的固定Scope,没法直接根据用户组或元数据动态调整。不用创建两个App Client,这里有几个实用的解决方案:

方案1:利用Cognito Pre Token Generation Lambda Trigger(最推荐)

这是AWS官方推荐的动态修改Token内容的方式,能在Access Token生成前根据用户信息调整Scope:

  • 首先,确保你的App Client已经把https://wibble-api.com/read和https://wibble-api.com/full都加入了允许的自定义Scope列表(这样后续Lambda添加的Scope才会被保留)
  • 创建一个Lambda函数,配置为Cognito User Pool的Pre Token Generation触发器
  • 在Lambda函数里,从触发事件event.request.userAttributes或event.request.groupConfiguration.groupsToOverride获取用户的付费状态(比如从用户元数据的subscription_status字段,或者用户所属的paid-users/free-users组)
  • 根据用户类型,动态修改event.response.claimsOverrideDetails.groupOverrideDetails.scopes字段:
    # 示例Python代码片段
    def lambda_handler(event, context):
        # 判断用户是否为付费用户(示例:从用户组判断)
        is_paid = "paid-users" in event.request.groupConfiguration.groupsToOverride
        
        if is_paid:
            event.response.claimsOverrideDetails.groupOverrideDetails.scopes = ["https://wibble-api.com/full"]
        else:
            event.response.claimsOverrideDetails.groupOverrideDetails.scopes = ["https://wibble-api.com/read"]
        
        return event
    
  • 这样生成的Access Token里的scope字段就会根据用户类型自动对应,API Gateway的Cognito Authorizer可以正常校验Scope权限

方案2:用用户组替代Scope做权限控制

如果不想修改Scope,也可以直接基于Cognito用户组来控制API访问:

  • 给未付费用户分配free-tier组,付费用户分配paid-tier组
  • 在API Gateway的Cognito Authorizer配置里,不需要指定OAuth Scopes;而是在API的集成请求(或者单独的自定义授权器)中,解析Access Token里的cognito:groups Claim
  • 根据用户所属的组来判断是否允许执行API方法(比如只读API允许free-tier和paid-tier,写操作只允许paid-tier)

方案3:自定义认证流程(适合高度定制场景)

如果Hosted UI的限制太多,你可以放弃直接用Hosted UI的隐式授权,改用自定义前端认证流程:

  • 前端调用Cognito的InitiateAuth API完成登录,获取ID Token和Access Token
  • 前端把ID Token传给你的后端服务,后端解析Token获取用户信息,判断用户类型
  • 后端根据用户类型,调用Cognito的UpdateUserAttributes给用户添加临时标记,或者直接生成一个包含对应Scope的自定义JWT(但更推荐用Cognito原生Token)
  • 前端用这个处理后的Token访问API Gateway

注意事项

  • 用Pre Token Generation Trigger时,Lambda需要有访问Cognito用户信息的权限(可以通过IAM角色配置)
  • App Client的允许Scope必须包含所有可能用到的Scope,否则Cognito会自动过滤掉Lambda添加的未授权Scope
  • 测试时可以用jwt.io解析生成的Access Token,确认scope字段是否符合预期

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 08:42:43