MENU

开放式 api 简单安全验证案例

• September 16, 2020 • WEB#

前言:

前后端分离的项目,api 难免会暴露,特别是不需要登陆的开放式 api。为防止 api 被他人盗用,在前端请求参数中添加 token,后端进行对比验证是简单有效的方法。

思路:

前端 ajax 请求时,带上时间戳参数 timestamp 和由 时间戳 + 唯一字符串 (secret) 通过约定算法生成的参数 token,后端拿到 timestamp 参数后,使用和前端相同的算法计算出 token,并与前端传过来的 token 对比,相同则通过验证。当然为防止盗用者使用抓取的 timestamptoken 重复提交,需要对比客户端和服务器的时间戳是否超时。

代码:

前端(JavaScript):

<script
src="https://ku.oioweb.cn/js/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 = "123";
  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="123";
return md5($time.$secret);
}

提醒:

前端生成 token 的算法 createToken() 尽量保密,可以使用 js 加密工具。
API 使用第三方滑动验证的也可以。

- - - The END - - -
  • 文章标题:开放式 api 简单安全验证案例
  • 文章链接:http://blog.iabiao.cn/index.php/archives/70.html
  • 版权所有:本文版权归 abiao 所有,转载请注明出处!除特殊注明外 (如有侵权,请 点此联系我微信公众号二维码
  • Archives QR Code Tip
    QR Code for this page
    Tipping QR Code
    Leave a Comment