如何用JavaScript实现AWS Serverless SaaS认证获取函数
在JavaScript中实现AWS Serverless SaaS租户注册的API Gateway请求签名
你不需要硬编码凭证,可以通过AWS SDK的凭证链机制自动获取当前环境的有效凭证(比如Lambda执行角色的临时凭证、本地AWS配置文件/环境变量中的凭证),再用AWS Signature V4签名工具生成符合要求的请求签名,完全替代Python代码中boto3 Session + AWSRequestsAuth的逻辑。
下面是具体实现方案,以Node.js环境(适配Lambda运行时)为例:
推荐方案:使用AWS SDK v3(官方推荐)
AWS SDK v3采用模块化设计,体积更小,更适合Serverless场景。
1. 安装依赖
执行以下命令安装所需的SDK模块和请求工具:
npm install @aws-sdk/signature-v4 @aws-sdk/credential-providers @aws-sdk/util-uri-escape @aws-sdk/util-format-url node-fetch
2. 实现签名请求代码
const { SignatureV4 } = require("@aws-sdk/signature-v4"); const { defaultProvider } = require("@aws-sdk/credential-providers"); const { formatUrl } = require("@aws-sdk/util-format-url"); const { escapePath } = require("@aws-sdk/util-uri-escape"); const fetch = require("node-fetch"); // 替换为你的API Gateway配置 const API_REGION = "us-east-1"; const API_ENDPOINT = "https://xxxx.execute-api.us-east-1.amazonaws.com/prod"; const TENANT_REGISTER_PATH = "/tenant/register"; // 创建Signature V4签名器,自动获取凭证链 const signer = new SignatureV4({ credentials: defaultProvider(), // 按优先级自动获取凭证:环境变量 > 本地配置 > IAM角色 region: API_REGION, service: "execute-api", // API Gateway对应的服务名 sha256: (str) => require("crypto").createHash("sha256").update(str).digest("hex"), }); // 封装租户注册请求 async function registerTenant(tenantInfo) { // 构造基础请求参数 const apiUrlObj = new URL(API_ENDPOINT); const request = { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify(tenantInfo), hostname: apiUrlObj.hostname, path: escapePath(`${apiUrlObj.pathname}${TENANT_REGISTER_PATH}`), }; // 生成签名后的请求头和参数 const signedRequest = await signer.sign(request); // 格式化完整URL并发送请求 const fullUrl = formatUrl({ protocol: "https", hostname: request.hostname, path: request.path, }); const response = await fetch(fullUrl, { method: signedRequest.method, headers: signedRequest.headers, body: signedRequest.body, }); return await response.json(); } // 调用示例 registerTenant({ name: "demo-tenant", adminEmail: "admin@demo.com" }) .then(res => console.log("租户注册成功:", res)) .catch(err => console.error("租户注册失败:", err));
备选方案:使用AWS SDK v2
如果你的项目仍在使用AWS SDK v2,可以用以下方式实现:
const AWS = require('aws-sdk'); const fetch = require('node-fetch'); // 配置API信息 const API_REGION = "us-east-1"; const API_ENDPOINT = "https://xxxx.execute-api.us-east-1.amazonaws.com/prod"; const TENANT_REGISTER_PATH = "/tenant/register"; // 自动加载凭证(遵循AWS凭证链) AWS.config.region = API_REGION; // 创建API请求签名器 const request = new AWS.HttpRequest(`${API_ENDPOINT}${TENANT_REGISTER_PATH}`, API_REGION); request.method = "POST"; request.headers["Content-Type"] = "application/json"; const signer = new AWS.Signers.V4(request, "execute-api"); signer.addAuthorization(AWS.config.credentials, new Date()); // 发送注册请求 async function registerTenant(tenantInfo) { request.body = JSON.stringify(tenantInfo); const response = await fetch(`${API_ENDPOINT}${TENANT_REGISTER_PATH}`, { method: request.method, headers: request.headers, body: request.body, }); return await response.json(); }
关键说明
- 凭证自动获取:
defaultProvider()(v3)或AWS.config.credentials(v2)会自动按照AWS官方的凭证优先级获取有效凭证,完全不需要硬编码Access Key/Secret Key,适配Lambda、EC2、本地开发等所有场景。 - 签名兼容性:上述代码实现的Signature V4签名和Python的
AWSRequestsAuth逻辑完全一致,能够被API Gateway的IAM认证正确识别。 - 权限配置:确保执行该代码的实体(比如Lambda角色)拥有
execute-api:Invoke权限,允许调用目标API Gateway端点。
内容的提问来源于stack exchange,提问作者Felipe Freire
相关产品推荐
相关产品推荐

