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

如何通过自定义授权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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 13:33:18