部分 space 的 api 可以直接使用,而部分需要身份验证(登录)之后才能使用。网页端也是一样的,后者直接访问时会被拦下来:
目前,我是通过简单的 ctx.post 请求 api:
const res = await this.ctx.http.post(requestUrl, payload);
很显然,这种方式不能访问上文提到的那种 space 的 api。我应该怎么做才能正常访问?
官方提供的方法是使用 python 的 sdk 的身份验证,而我想要通过 javascript 完成请求。
要通过 JavaScript 完成对需要身份验证的 Space API 的请求,您需要遵循阿里云的身份验证机制(签名机制)。以下是详细的解决方案和步骤:
阿里云 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
)。
在 JavaScript 中,您可以通过以下步骤实现签名并完成 API 请求:
确保您已获取以下信息: - AccessKey ID 和 AccessKey Secret。 - API 的 Endpoint(例如 https://mpserverless.aliyuncs.com
)。 - API 的具体路径和请求参数。
签名的生成过程如下: 1. 按照字典顺序对请求参数进行排序。 2. 将排序后的参数拼接成字符串,格式为 key1=value1&key2=value2
。 3. 构造待签名字符串,格式为:
HTTPMethod + "\n" + CanonicalizedResourcePath + "\n" + CanonicalizedQueryString
其中: - HTTPMethod
是请求方法(如 POST
或 GET
)。 - CanonicalizedResourcePath
是 API 的路径(如 /organization/{organizationId}/data/spaces
)。 - CanonicalizedQueryString
是排序后的参数字符串。 4. 使用 HMAC-SHA1 算法和 AccessKey Secret 对待签名字符串进行加密,生成签名值。 5. 对签名值进行 Base64 编码,并进行 URL 安全编码。
将生成的签名值和其他必要参数附加到请求中,使用 ctx.http.post
发送请求。
以下是一个完整的 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();
400
错误可能表示参数无效或签名错误。您可以使用阿里云提供的 OpenAPI Explorer 工具直接调试 API,无需手动计算签名。运行成功后,OpenAPI Explorer 还会自动生成 SDK 代码示例,供您参考。
通过上述方法,您可以使用 JavaScript 成功调用需要身份验证的 Space API。
ModelScope旨在打造下一代开源的模型即服务共享平台,为泛AI开发者提供灵活、易用、低成本的一站式模型服务产品,让模型应用更简单!欢迎加入技术交流群:微信公众号:魔搭ModelScope社区,钉钉群号:44837352