API 接口设计中 Token 类型的分类与设计

在实际的网站设计中我们经常会遇到用户数据的验证和加密的问题,如果实现单点,如果保证数据准确,如何放着重放,如何防止CSRF等等

其中,在所有的服务设计中,都不可避免的涉及到Token的设计。

目前,基于Token的生成方,我们把Token生成分为两种类型。

1、基于用户/网站,可见的加密请求方式

2、基于服务器间通讯的不可见加密请求方式(API Token)

其中,网页/APP访问又分为 登录态和非登录态 两种请求区别。

(非登录态请求要求用户访问页面时会随机生成唯一且有时效性的token,该token在每次请求时都是不同)

(登录状态中,token会保存一定的时间,页面中的token会作为用户身份识别)

虽说两者作用有一定的区别,但是实现的原理是相同的。

1、非登录状态

原理:

非登录状态中,防止服务器资源被重复利用,我们在前端页面中会添加一步建立初始Session的过程,该过程来确保下一步关键请求不被利用。

一般这种验证方式用于体验页面,如:视频播放页面,项目或功能展示页面等

优点:

目的就是有点,防止token被盗用,重复请求服务器资源(类似于抖音视频播放时的签名算法作用)

缺点:

所有前端加密都有被破解的可能,需要对具体的JS进行混淆,同时添加https和来源判断

2、登录状态

 登录状态的Token

登录态token 通过服务器生成:

Encode(MD5({session}+{用户信息摘要}+{Timestamp})+TimeStamp)

联合Redis 刷新用户登录时长及token有效时长。Redis设置自动过期时间。

验证方法:

1decode(Token)->sign+TimeStamp 2 3if(sign===MD5({session}+{用户信息摘要}+{Timestamp})){  // XXXX}

(防止弱语言的判断逻辑,验证PW和Token要用=== 强类型判断)

**退出登录:**删除Redis 键值

**单点登录:**重新登录时信息更新,用户信息摘要不变,自动刷新Redis的Token值和有效期

3、API 非对称加密

api的非对称加密常用于服务器之间的请求,双方各自保存私钥和公钥。API接口中常体现于【APP_ID,APP_KEY|APP_SECRET】

Token 生成算法:

1/** 2 * 生成token 3 * @param $user_info string 4 * @param $app_key string app_key 5 * @param $app_id int app_id 6 * @return string 7 */ 8 public function generate_access_token($user_info , $app_key, $app_id) 9 { 10 $time = time(); 11 $sign = sha1($time . $advertiser_id . $app_key); 12 $token = base64_encode("{$time},{$user_info },{$app_id},{$sign}"); 13 return $token; 14 }

Token解析方法:

解密的方法中对时效性做了一分钟的验证,实际项目中可以根据情况开放失效的设置。

1/** 2 * 解析token 3 * @param $access_token 4 * @return array 5 */ 6 public function analysis_access_token($access_token) 7 { 8 9 $token_array = base64_decode($access_token); 10 $token_array = explode(',', $token_array); 11 $time = $token_array[0]; 12 $user_info = $token_array[1]; 13 $app_id = $token_array[2]; 14 $sign = $token_array[3]; 15 16 if ($time < (time() - 60) || $time > (time() + 60)) { 17 call_back(1101, 'Access Token expire !token=' . $access_token); 18 } 19 20 global $third_platform_app_key;// app_id-app_key对应表 21 22 if (!isset($third_platform_app_key[$app_id])) { 23 call_back(1101, 'Access Token App id Error!token=' . $access_token); 24 } 25 26 $app_key = $third_platform_app_key[$app_id]; 27 28 $local_sign = sha1($time . $user_info . $app_key); 29 30 if ($local_sign === $sign) { 31 return [ 32 'access_token' => $access_token, 33 'user_info' => $user_info, 34 'time' => $time, 35 'app_id' => $app_id, 36 'app_key' => $app_key, 37 ]; 38 } else { 39 call_back(1101, 'Access Token Sign Error!token=' . $access_token); 40 } 41 }

 改Token方式要求每次请求都需要生成新的token来确保请求的时效性

**另外:**为了加强API接口请求的完整性,我们也会对请求内容进行字段排序后摘要验证。(详情参考:https://open.taobao.com/docV2.htm?docId=101617&docType=1)

今天的普及到这里就结束啦,谢谢大家,也欢迎大家留言讨论。

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

java将前端的json数组字符串转换为列表

记录下在前端通过ajax提交了一个json数组的字符串,在后端如何转换为列表。前端数据转化与请求varcontracts{id:'1',name:'yanggb合同1'},{id:'2',name:'yanggb合同2'},{id:'3',name:'yang

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )

API 接口设计中 Token 类型的分类与设计 - HelloWorld