版权声明:如果转载请注明出处,不喜勿喷,谢谢 https://blog.csdn.net/qq_38358436/article/details/88888727
参考: http://www.cnblogs.com/codelir/p/5327462.html
签名的主要作用
- 请求来源(身份)是否合法?
- 请求的唯一性(不可重复请求)
步骤
- 服务端给客户端分配
app_id
app_secret
- 客户端和服务端通过指定的算法生成签名
sign
- 客户端每次请求都把
app_id
和生成好的sign
放到请求参数中传递给服务端 - 服务端拿出客户端传递的
app_id 对应的 app_secret
通过算法生成一个sign
和客户端传递的sign
对比
注意: app_secret
只是为了生成 sign
用的,请不要将 app_secret
放到请求参数中
关于算法
- 将所有请求参数加入到算法中
- 将时间戳加入到算法中(注意: js获取的时间戳和PHP获取的时间戳格式不一致)
- 将
app_secret
加入到算法中
举个例子, 此处以 jquery 和 laravel 为例
使用 axios
的话,原理也是一样的
- 客户端代码
<script src="jquery.min.js"></script>
<script>
$(function () {
// 请求参数
var params = {
id: 1,
app_id: 'xKYf550dzriIVeZbrcz2WpAMV0SOMCelpUcNfLDWm9vf1BdsT41uvqVE3PLH7lQx'
};
/**
* 生成签名加密算法
* @param $params
*/
function signGenerator($params) {
// 获取秘钥和请求参数循环组成: secret:key=value&key=value×tamp
var secret = 'fw2FZjjmvKlpoByizWfScZbAluXdNwooABu93LEdKRV5ZOtJKrL7LEosb4IGBw4W';
var sign = secret + ':';
for (var key in params) {
sign += key + '=' + $params[key] + '&';
}
// 获取PHP格式的时间戳
var timestamp = (new Date()).getTime() / 1000;
console.log("客户端生成的签名:", window.btoa(sign + Math.floor(timestamp)));
// window.btoa是js内置的base64加密算法
return window.btoa(sign + Math.floor(timestamp));
}
// 发送请求
$.ajax({
type: "GET",
url: "https://www.example.com/api/test",
data: params,
beforeSend: function (request) {
// 将签名添加到请求头中
request.setRequestHeader("sign", signGenerator(params));
},
success: function (response) {
console.log(JSON.stringify(response));
}
});
});
</script>
- 服务端代码
此处使用的是laravel的中间件