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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 03:26:14