插件窝 干货文章 如何使用Authing和AWS JWT Authorizer替换Cognito

如何使用Authing和AWS JWT Authorizer替换Cognito

Authing your JWT Authorizer 992    来源:    2025-04-21

使用Authing和AWS JWT Authorizer替换Cognito的指南

概述

Amazon Cognito是一个完整的身份验证和用户管理服务,但如果您希望使用Authing作为替代方案,同时保持AWS API Gateway的JWT验证功能,以下是详细的实现步骤。

实施步骤

1. 在Authing中设置应用

  1. 创建Authing应用:

    • 登录Authing控制台
    • 创建新应用,选择"标准Web应用"类型
    • 配置回调URL(如您的应用域名)
  2. 配置JWT设置:

    • 在应用设置中找到"令牌配置"
    • 设置合适的令牌过期时间
    • 确保使用RS256算法(这是AWS JWT Authorizer支持的)
  3. 获取必要信息:

    • 记录应用ID(作为JWT的aud声明)
    • 获取Issuer URL(通常是https://{your-domain}.authing.cn/oidc)
    • 下载JWKS公钥(或记录JWKS端点URL)

2. 配置AWS API Gateway JWT Authorizer

  1. 创建JWT Authorizer:

    aws apigateway create-authorizer \
     --rest-api-id YOUR_API_ID \
     --name AuthingAuthorizer \
     --type JWT \
     --identity-source '$request.header.Authorization' \
     --jwt-configuration \
       '{
         "issuer": "https://YOUR_AUTHING_DOMAIN.authing.cn/oidc",
         "audience": ["YOUR_AUTHING_APP_ID"],
         "jwksUri": "https://YOUR_AUTHING_DOMAIN.authing.cn/oidc/jwks"
       }'
    
  2. 或通过AWS控制台:

    • 进入API Gateway服务
    • 选择您的API → "Authorizers" → "Create New Authorizer"
    • 选择类型为JWT
    • 填写Issuer、Audience和JWKS URI

3. 客户端集成

  1. 安装Authing SDK:

    npm install @authing/web
    
  2. 初始化Authing客户端:

    import { Authing } from '@authing/web';
    
    const authing = new Authing({
     appId: 'YOUR_AUTHING_APP_ID',
     host: 'https://YOUR_AUTHING_DOMAIN.authing.cn',
     redirectUri: 'https://your-app.com/callback'
    });
    
  3. 登录并获取JWT:

    // 跳转到Authing登录页面
    authing.login();
    
    // 处理回调后获取token
    const token = await authing.getAccessToken();
    
    // 调用API时携带token
    fetch('https://your-api.execute-api.region.amazonaws.com/prod/endpoint', {
     headers: {
       'Authorization': `Bearer ${token}`
     }
    });
    

4. 后端验证(可选)

如果需要在Lambda中进一步验证JWT:

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

const client = jwksClient({
  jwksUri: 'https://YOUR_AUTHING_DOMAIN.authing.cn/oidc/jwks'
});

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

exports.handler = async (event) => {
  const token = event.headers.Authorization.split(' ')[1];

  try {
    const decoded = await new Promise((resolve, reject) => {
      jwt.verify(token, getKey, {
        audience: 'YOUR_AUTHING_APP_ID',
        issuer: 'https://YOUR_AUTHING_DOMAIN.authing.cn/oidc',
        algorithms: ['RS256']
      }, (err, decoded) => {
        if (err) reject(err);
        else resolve(decoded);
      });
    });

    // 验证通过,处理请求
    return {
      statusCode: 200,
      body: JSON.stringify({ message: 'Authenticated', user: decoded.sub })
    };
  } catch (err) {
    return {
      statusCode: 401,
      body: JSON.stringify({ error: 'Unauthorized' })
    };
  }
};

注意事项

  1. Cognito特有功能替代:

    • 用户池管理: Authing提供类似功能
    • 联合身份: Authing支持多种社交登录和企业身份源
    • 自定义属性: Authing也支持自定义用户字段
  2. 迁移考虑:

    • 如果已有Cognito用户,需要导出数据并导入Authing
    • 考虑并行运行一段时间以确保平稳过渡
  3. 性能考虑:

    • JWKS端点可能有缓存需求
    • 考虑在Lambda中缓存公钥
  4. 成本比较:

    • 评估Authing定价与Cognito的差异
    • 考虑请求量和用户数量

通过以上步骤,您可以成功用Authing替换Cognito,同时保持API Gateway的JWT验证功能。