前话
以下为一个前端人员的推想,后端博大精深,如有错误欢迎指出。
前后端分离的项目,api难免会暴露,特别是不需要登陆的开放式api。为防止api被他人盗用,在前端请求参数中添加token,后端进行对比验证是简单有效的方法。
思路
前端ajax请求时,带上时间戳参数timestamp
和由 时间戳+唯一字符串(secret)通过约定算法生成的参数token
,后端拿到timestamp
参数后,使用和前端相同的算法计算出token
,并与前端传过来的token
对比,相同则通过验证。当然为防止盗用者使用抓取的timestamp
和token
重复提交,需要对比客户端和服务器的时间戳是否超时。
源码
前端 javascript
<script src="./md5.js"></script>
$.ajax({
url: "/api.php",
headers: {
timestamp: (new Date().getTime() + '').substr(0, 10),
token: createToken()
}
}).success((res) => {
console.log(res)
})
function createToken() {
var timestamp = (new Date().getTime() + '').substr(0, 10);
var secret = "111";
return hex_md5(timestamp + secret);
}
后端 php
<?php
header("Access-Control-Allow-Origin:*");
if (tokenCheck()!==1) {
$json['status']=0;
$json['data']='token error!';
}else{
$json['status']=1;
$json['data']='token ok!';
//main code ...
}
echo json_encode($json);
function tokenCheck(){
$timestamp=isset($_SERVER['HTTP_TIMESTAMP'])?$_SERVER['HTTP_TIMESTAMP']:"";
$token=isset($_SERVER['HTTP_TOKEN'])?$_SERVER['HTTP_TOKEN']:"";
$diff =time()-$timestamp;
return (($diff>30) || ($token!==createToken($timestamp))) ? 0 : 1;
}
function createToken($time){
$secret="111";
return md5($time.$secret);
}
提醒
前端生成token的算法createToken()
尽量保密。汗~~
演示 demo
(本篇完。有疑问欢迎留言探讨)
热门文章
- 微信小程序“拍照识图”上线(63,957)
- YouTube评论翻译插件《油管评论翻译机》上线了(61,280)
- 基金助手--chrome浏览器插件(45,587)
- 拍照识别彩票结果在线工具(32,127)
- vue+tabs动态组件方案漫谈(26,600)
- 《油管评论翻译机》使用说明书(26,035)
- 网页打印插件Print.js(24,108)
- 自用YouTube抓取评论+翻译工具(23,591)
- YouTube评论导出免费在线工具(18,450)
- px转rem/vw方法小结(17,603)