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

2018-02-13 | 3,003浏览 | 0评论 | 标签:api 开放式api

api_token.jpg

前话

以下为一个前端人员的推想,后端博大精深,如有错误欢迎指出。

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

思路

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

源码

前端 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

演示地址

(本篇完。有疑问欢迎留言探讨)

留言:

*

* (方便回复通知)

打赏
编辑代码 运行结果
退出