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

如何为微服务实现集中式Cognito JWT验证

Cognito JWT Token验证方案与微服务部署实践

针对你的四个微服务(users、cohorts、schemes、booking),Cognito JWT Token的验证有两种主流方案,各有适用场景:

方案一:每个微服务独立验证Token

无需额外依赖组件,每个微服务自行实现Token验证逻辑,但会存在代码重复的问题。

实现方式

每个服务集成JWT验证库(比如jsonwebtoken),通过Cognito提供的JWKS端点获取公钥,验证Token的签名、有效期、受众(aud)、签发者(iss)等核心字段。

以Node.js为例,核心代码片段如下:

const jwt = require('jsonwebtoken');
const jwksClient = require('jwks-rsa');

// 替换为你的Cognito用户池信息
const client = jwksClient({
  jwksUri: 'https://cognito-idp.{region}.amazonaws.com/{userPoolId}/.well-known/jwks.json'
});

function getSigningKey(header, callback) {
  client.getSigningKey(header.kid, (err, key) => {
    if (err) callback(err);
    else callback(null, key.getPublicKey());
  });
}

async function validateToken(token) {
  return new Promise((resolve, reject) => {
    jwt.verify(
      token.replace('Bearer ', ''),
      getSigningKey,
      {
        audience: '你的Cognito客户端ID',
        issuer: 'https://cognito-idp.{region}.amazonaws.com/{userPoolId}'
      },
      (err, decoded) => err ? reject(err) : resolve(decoded)
    );
  });
}

在微服务的接口入口处调用这个验证函数,通过后再处理业务逻辑。

方案二:统一网关层验证(Lambda+API Gateway)

完全可行,把验证逻辑集中在API Gateway的自定义Lambda授权器中,所有请求先经过授权器验证Token,通过后再转发到对应微服务。这种方式能避免重复代码,微服务只需专注业务逻辑。

实现步骤

  1. 创建Lambda授权器函数
    函数负责从请求头提取Token,完成验证后返回IAM策略,允许或拒绝请求。核心代码示例:

    const jwt = require('jsonwebtoken');
    const jwksClient = require('jwks-rsa');
    
    // 替换为你的Cognito配置
    const userPoolId = '{userPoolId}';
    const clientId = '{clientId}';
    const region = '{region}';
    const jwksUri = `https://cognito-idp.${region}.amazonaws.com/${userPoolId}/.well-known/jwks.json`;
    
    const client = jwksClient({ jwksUri });
    
    function getSigningKey(header, callback) {
      client.getSigningKey(header.kid, (err, key) => {
        err ? callback(err) : callback(null, key.getPublicKey());
      });
    }
    
    exports.handler = async (event) => {
      const token = event.authorizationToken?.replace('Bearer ', '');
      if (!token) {
        return generateDenyPolicy('unauthorized', event.methodArn);
      }
    
      try {
        const decoded = await new Promise((resolve, reject) => {
          jwt.verify(
            token,
            getSigningKey,
            { audience: clientId, issuer: `https://cognito-idp.${region}.amazonaws.com/${userPoolId}` },
            (err, decoded) => err ? reject(err) : resolve(decoded)
          );
        });
    
        // 返回允许访问的策略,并传递用户信息到微服务
        return {
          principalId: decoded.sub,
          policyDocument: {
            Version: '2012-10-17',
            Statement: [{
              Action: 'execute-api:Invoke',
              Effect: 'Allow',
              Resource: event.methodArn
            }]
          },
          context: {
            userId: decoded.sub,
            email: decoded.email
          }
        };
      } catch (err) {
        console.error('Token验证失败:', err);
        return generateDenyPolicy('unauthorized', event.methodArn);
      }
    };
    
    function generateDenyPolicy(principalId, resource) {
      return {
        principalId,
        policyDocument: {
          Version: '2012-10-17',
          Statement: [{
            Action: 'execute-api:Invoke',
            Effect: 'Deny',
            Resource: resource
          }]
        }
      };
    }
    
  2. 配置API Gateway关联授权器

    • 在API Gateway控制台中,创建"自定义授权器",选择刚才的Lambda函数,设置Token来源为Authorization请求头。
    • 将四个微服务的所有API资源都关联这个授权器,确保请求先经过验证。
  3. 微服务端处理
    微服务无需再验证Token,直接从API Gateway传递的请求上下文(比如event.requestContext.authorizer.context)中获取用户信息即可。

方案对比

方案优点缺点
微服务独立验证服务自治,无额外依赖代码重复,维护成本高
统一网关Lambda验证集中管理,微服务专注业务增加网关依赖,需保障授权器可用性

内容的提问来源于stack exchange,提问作者Mohamed Anser Ali

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 23:37:45