使用 javascript 开发时,应该如何调用 space 中的 gradio api?

部分 space 的 api 可以直接使用,而部分需要身份验证(登录)之后才能使用。网页端也是一样的,后者直接访问时会被拦下来:

image.png

目前,我是通过简单的 ctx.post 请求 api:

const res = await this.ctx.http.post(requestUrl, payload);

很显然,这种方式不能访问上文提到的那种 space 的 api。我应该怎么做才能正常访问?

官方提供的方法是使用 python 的 sdk 的身份验证,而我想要通过 javascript 完成请求。

展开
收起
petertan303 2024-05-12 11:57:00 166 分享 版权
阿里云 AI 助理回答

要通过 JavaScript 完成对需要身份验证的 Space API 的请求,您需要遵循阿里云的身份验证机制(签名机制)。以下是详细的解决方案和步骤:


1. 理解签名机制

阿里云 API 调用需要通过签名(Signature)进行身份验证。签名机制的核心是使用 AccessKey ID 和 AccessKey Secret 对请求进行加密生成签名值,并将签名值附加到请求中。

签名机制的关键要素包括: - AccessKey ID:用于标识用户身份。 - AccessKey Secret:用于生成签名的密钥,必须严格保密。 - 签名参数: - SignatureMethod:签名算法,目前支持 HMAC-SHA1。 - SignatureVersion:签名版本,当前为 1.0。 - SignatureNonce:唯一随机数,防止重放攻击。 - Timestamp:请求的时间戳,格式为 ISO 8601(如 2023-10-01T12:00:00Z)。


2. JavaScript 实现签名逻辑

在 JavaScript 中,您可以通过以下步骤实现签名并完成 API 请求:

步骤 1:准备必要参数

确保您已获取以下信息: - AccessKey ID 和 AccessKey Secret。 - API 的 Endpoint(例如 https://mpserverless.aliyuncs.com)。 - API 的具体路径和请求参数。

步骤 2:生成签名

签名的生成过程如下: 1. 按照字典顺序对请求参数进行排序。 2. 将排序后的参数拼接成字符串,格式为 key1=value1&key2=value2。 3. 构造待签名字符串,格式为:

HTTPMethod + "\n" + CanonicalizedResourcePath + "\n" + CanonicalizedQueryString

其中: - HTTPMethod 是请求方法(如 POSTGET)。 - CanonicalizedResourcePath 是 API 的路径(如 /organization/{organizationId}/data/spaces)。 - CanonicalizedQueryString 是排序后的参数字符串。 4. 使用 HMAC-SHA1 算法和 AccessKey Secret 对待签名字符串进行加密,生成签名值。 5. 对签名值进行 Base64 编码,并进行 URL 安全编码。

步骤 3:发送请求

将生成的签名值和其他必要参数附加到请求中,使用 ctx.http.post 发送请求。


3. 代码示例

以下是一个完整的 JavaScript 示例,展示如何生成签名并调用需要身份验证的 API:

const crypto = require('crypto');
const axios = require('axios');

// 配置 AccessKey 和 API 信息
const accessKeyId = 'your-access-key-id';
const accessKeySecret = 'your-access-key-secret';
const endpoint = 'https://mpserverless.aliyuncs.com';
const apiPath = '/organization/{organizationId}/data/spaces';

// 请求参数
const payload = {
  organizationId: '61db9af2148974246bexxxx',
  startTime: '2024-05-01 00:00:00',
  endTime: '2024-06-01 00:00:00',
};

// 生成签名
function generateSignature(params, accessKeySecret) {
  // 1. 按字典顺序排序参数
  const sortedParams = Object.keys(params)
    .sort()
    .reduce((acc, key) => {
      acc[key] = params[key];
      return acc;
    }, {});

  // 2. 拼接参数字符串
  const queryString = Object.entries(sortedParams)
    .map(([key, value]) => `${encodeURIComponent(key)}=${encodeURIComponent(value)}`)
    .join('&');

  // 3. 构造待签名字符串
  const stringToSign = `POST\n${apiPath}\n${queryString}`;

  // 4. 使用 HMAC-SHA1 加密
  const signature = crypto
    .createHmac('sha1', accessKeySecret)
    .update(stringToSign)
    .digest('base64');

  // 5. URL 安全编码
  return encodeURIComponent(signature);
}

// 添加公共参数
const commonParams = {
  SignatureMethod: 'HMAC-SHA1',
  SignatureVersion: '1.0',
  SignatureNonce: uuidv4(), // 使用 UUID 生成唯一随机数
  Timestamp: new Date().toISOString(),
  AccessKeyId: accessKeyId,
};

// 合并所有参数
const allParams = { ...payload, ...commonParams };

// 生成签名并添加到参数中
allParams.Signature = generateSignature(allParams, accessKeySecret);

// 发送请求
async function callApi() {
  try {
    const response = await axios.post(`${endpoint}${apiPath}`, allParams);
    console.log('API Response:', response.data);
  } catch (error) {
    console.error('API Error:', error.response ? error.response.data : error.message);
  }
}

callApi();

4. 注意事项

  • AccessKey 安全性:请勿将 AccessKey ID 和 AccessKey Secret 直接暴露在前端代码中。建议将签名逻辑放在后端服务中,前端仅负责调用后端接口。
  • 时间同步:确保服务器时间与标准时间同步,否则可能导致签名验证失败。
  • 错误处理:根据返回的 HTTP 状态码和错误信息排查问题。例如,400 错误可能表示参数无效或签名错误。

5. 调试工具推荐

您可以使用阿里云提供的 OpenAPI Explorer 工具直接调试 API,无需手动计算签名。运行成功后,OpenAPI Explorer 还会自动生成 SDK 代码示例,供您参考。


通过上述方法,您可以使用 JavaScript 成功调用需要身份验证的 Space API。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答

ModelScope旨在打造下一代开源的模型即服务共享平台,为泛AI开发者提供灵活、易用、低成本的一站式模型服务产品,让模型应用更简单!欢迎加入技术交流群:微信公众号:魔搭ModelScope社区,钉钉群号:44837352

还有其他疑问?
咨询AI助理