为了对 HTTP 请求增加签名头部(Signature Header),以防止第三方非法调用,你可以采用以下方法:
使用 API 密钥(API Key):
为每个合法的请求方颁发唯一的 API 密钥,要求请求方在每个请求的头部或参数中提供该密钥。服务器端可以根据密钥来验证请求的合法性。
使用 JWT(JSON Web Tokens):
JSON Web Tokens (JWT) 是一种用于在请求中包含认证信息的方式。你可以在服务器端生成一个 JWT,然后将其附加到请求头部。请求方需要解析 JWT 来验证请求的合法性。
使用 HMAC(Hash-based Message Authentication Code):
HMAC 是一种哈希消息验证代码,可以用于验证请求的完整性和来源。请求方和服务器端都共享一个密钥,服务器端使用该密钥来生成 HMAC,请求方在请求中包含 HMAC。服务器端验证 HMAC 以确认请求的合法性。
自定义签名方案:
你也可以实现自己的签名方案,例如将请求参数按照特定规则进行排序,然后使用密钥对参数进行哈希运算,将哈希值添加到请求头部,服务器端再次执行相同的操作来验证请求的合法性。
以下是一个示例 Node.js 代码片段,用于生成包含签名头部的 HTTP 请求:
const crypto = require('crypto');
const http = require('http');
const secretKey = 'your-secret-key'; // 用于生成签名的密钥
// 创建 HTTP 请求
const request = http.request({
hostname: 'api.example.com',
path: '/endpoint',
method: 'GET',
headers: {
'Content-Type': 'application/json',
},
}, (response) => {
let responseData = '';
response.on('data', (chunk) => {
responseData += chunk;
});
response.on('end', () => {
console.log('Response:', responseData);
});
});
// 生成签名头部
const timestamp = Date.now();
const signature = crypto
.createHmac('sha256', secretKey)
.update(`GET /endpoint ${timestamp}`)
.digest('hex');
// 将签名头部添加到请求
request.setHeader('Authorization', `Signature ${signature}`);
request.setHeader('X-Timestamp', timestamp);
// 发送请求
request.end();
在上述示例中,我们使用 Node.js 的 crypto
模块生成签名,并将签名作为 Authorization
头部添加到请求中。服务器端需要使用相同的密钥和算法来验证签名的合法性。
请注意,这只是一个示例,实际的签名方案和头部名称可能会因你的需求而不同。确保在设计签名机制时,考虑到安全性和可扩展性,并根据需要进行适当的配置和改进。