微信小程序可以通过对请求接口进行签名验证来保证接口的安全性,从而避免他人调用我们的接口。具体实现步骤如下:
1.在后端设置一个密钥,用于生成和验证签名。
import hashlib
APP_SECRET = 'your_app_secret' # 用于生成和验证签名的密钥
def generate_signature(params):
"""
生成签名
:param params: 需要签名的参数(字典类型)
:return: 签名值(字符串类型)
"""
keys = sorted(params.keys())
signature_str = '&'.join([key + '=' + str(params[key]) for key in keys])
signature_str += '&secret=' + APP_SECRET # 将密钥拼接到签名字符串中
signature = hashlib.sha1(signature_str.encode('utf-8')).hexdigest()
return signature
2.在前端发送请求时,将需要传递的参数和签名一起发送给后端。
const appSecret = 'your_app_secret'; // 与后端相同的密钥
const params = {
// 需要传递的参数
key1: value1,
key2: value2,
...
};
params.signature = generateSignature(params, appSecret); // 生成签名并添加到参数中
wx.request({
url: 'https://your_api_url',
data: params,
method: 'GET', // 或者 POST
success(res) {
console.log(res.data);
}
});
function generateSignature(params, appSecret) {
/*
* 生成签名
* @param {object} params - 需要签名的参数(对象类型)
* @param {string} appSecret - 生成签名所需的密钥
* @returns {string} signature - 签名值
*/
let keys = Object.keys(params).sort();
let signatureStr = keys.map(key => `${
key}=${
params[key]}`).join('&') + `&secret=${
appSecret}`;
let signature = sha1(signatureStr);
return signature;
}
function sha1(str) {
/*
* 计算 SHA1 哈希值
* @param {string} str - 待计算哈希值的字符串
* @returns {string} result - 计算得到的哈希值
*/
let md5sum = crypto.createHash('sha1');
md5sum.update(str);
let result = md5sum.digest('hex');
return result;
}
3.在后端接收到请求后,验证签名是否正确。如果不正确,则返回错误信息;否则,执行正常的业务逻辑。
from flask import Flask, request, jsonify
app = Flask(__name__)
@app.route('/your_api_url', methods=['GET', 'POST'])
def your_api_func():
params = request.args.to_dict() if request.method == 'GET' else request.json
signature = params.pop('signature', '') # 获取签名值并从参数中移除
if signature != generate_signature(params): # 验证签名是否正确
return jsonify({
'code': -1, 'msg': 'Signature verification failed.'})
# 执行正常的业务逻辑
...
在上面的代码中,我们定义了一个 Flask 路由 /your_api_url
,接收 GET 或 POST 请求,并获取请求中携带的参数和签名。然后,我们验证签名是否正确,如果不正确,则返回错误信息;否则,执行正常的业务逻辑。注意,这里的 generate_signature
函数应该与前端使用的函数一致,以确保生成的签名值相同。