如何通过自定义授权Lambda注入Claims,适配原有Cognito用户池逻辑?
自定义授权Lambda注入Claims匹配Cognito用户池事件结构
之前用Cognito用户池授权器时,API事件的requestContext.authorizer.claims里会包含用户核心信息(比如cognito:username),现在要让自定义授权Lambda实现完全一致的结构,只需要在返回的授权策略的context字段里嵌套一个claims对象即可。
具体实现步骤
- 验证JWT令牌后,直接提取解析得到的完整claims payload
- 在生成授权策略时,将这个claims对象放到
context的claims属性下
代码示例
const jwt = require('jsonwebtoken'); const jwkToPem = require('jwk-to-pem'); // 验证JWT并返回解析后的claims async function verifyToken(token) { // 此处省略获取JWK、转换为PEM格式、验证令牌的逻辑 // 验证成功后返回完整的claims payload return jwt.verify(token, pem, { algorithms: ['RS256'] }); } // 生成API Gateway授权策略 function generatePolicy(principalId, effect, resource, context) { const authResponse = { principalId }; if (effect && resource) { authResponse.policyDocument = { Version: '2012-10-17', Statement: [{ Action: 'execute-api:Invoke', Effect: effect, Resource: resource }] }; } // 传入包含claims的context,API Gateway会自动映射到requestContext.authorizer authResponse.context = context; return authResponse; } exports.handler = async (event) => { try { const token = event.authorizationToken.split(' ')[1]; const claims = await verifyToken(token); // 构建context,嵌套完整claims对象对齐Cognito结构 const context = { claims: claims, // 保留原有自定义字段(如果需要) username: claims['cognito:username'], role: claims['cognito:groups']?.[0] }; return generatePolicy(claims.sub, 'Allow', event.methodArn, context); } catch (error) { console.error('授权失败:', error); throw new Error('Unauthorized'); } };
效果验证
部署后,后端Lambda收到的请求事件会和Cognito用户池授权时结构一致:
// 后端Lambda接收的event示例片段 { requestContext: { authorizer: { claims: { 'cognito:username': 'user_123', 'cognito:groups': ['admin'], sub: 'xxxx-xxxx-xxxx-xxxx', email: 'user@example.com' // 其他JWT自带的claims字段 }, username: 'user_123', role: 'admin' } } }
内容的提问来源于stack exchange,提问作者harivishnu dadi
相关产品推荐
相关产品推荐

