如何为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
相关产品推荐
相关产品推荐

