Python3 -微信小程序接口安全设计

微信小程序可以通过对请求接口进行签名验证来保证接口的安全性,从而避免他人调用我们的接口。具体实现步骤如下:

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 函数应该与前端使用的函数一致,以确保生成的签名值相同。

猜你喜欢

转载自blog.csdn.net/qq_31810357/article/details/129738727
今日推荐