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

如何为Cognito用户组安全授权自定义Lambda解析器

AWS AppSync Lambda解析器Cognito用户组校验方案

核心问题解答

你需要校验的字段是identity.claims.cognito:groups,而非identity.claims.groups。

为什么不会被客户端绕过

该字段是AppSync服务端完成Cognito JWT令牌的签名验证后,从合法令牌的官方声明字段中自动解析注入到Lambda event对象的,和客户端提交的所有请求参数、自定义字段完全隔离,客户端没有任何路径可以篡改该字段的内容,也无法通过手动添加请求字段绕过校验。

标准安全实现步骤

  • 第一层前置校验(可选但推荐):在AppSync Schema的对应Query定义上添加@aws_cognito_user_pools指令,先拦截未携带合法Cognito令牌的请求,避免无效请求打到Lambda。
    示例Schema定义:
    type Query {
      myCustomQuery: QueryResult @aws_auth(cognito_groups: ["admin", "editor"]) @aws_cognito_user_pools
    }
    
  • 第二层Lambda侧兜底校验:直接从event的identity字段取Cognito官方注入的用户组信息做校验,禁止从客户端提交的arguments等字段取身份相关信息做校验。
    示例Node.js Lambda代码:
    // 替换为实际允许访问的Cognito用户组列表
    const ALLOWED_USER_GROUPS = ['admin', 'operation'];
    
    exports.handler = async (event) => {
      // 校验是否存在合法Cognito身份
      const cognitoGroups = event.identity?.claims?.['cognito:groups'];
      if (!cognitoGroups) {
        throw new Error('Unauthorized: 无有效用户身份凭证');
      }
    
      // 兼容单用户组(字符串)、多用户组(数组)两种返回格式
      const userInAllowedGroup = Array.isArray(cognitoGroups) 
        ? cognitoGroups.some(group => ALLOWED_USER_GROUPS.includes(group))
        : ALLOWED_USER_GROUPS.includes(cognitoGroups);
    
      if (!userInAllowedGroup) {
        throw new Error('Forbidden: 不属于允许访问的用户组');
      }
    
      // 后续业务逻辑
      // ...
    }
    

避坑说明

  • 不要使用identity.claims.groups做校验:这个字段不是Cognito令牌的官方默认字段,可能是客户端自定义添加的声明,没有官方签名保障,存在被篡改绕过的风险。
  • 不要相信任何客户端提交的身份相关参数:所有客户端传入的参数都只可用于业务逻辑处理,不可用于权限判断。

内容的提问来源于stack exchange,提问作者D. Richard

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 13:54:08