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设置自动过期时间。
验证方法:
decode(Token)->sign+TimeStamp
if(sign===MD5({session}+{用户信息摘要}+{Timestamp})){
// XXXX
}
(防止弱语言的判断逻辑,验证PW和Token要用=== 强类型判断)
退出登录:删除Redis 键值
单点登录:重新登录时信息更新,用户信息摘要不变,自动刷新Redis的Token值和有效期
3、API 非对称加密
api的非对称加密常用于服务器之间的请求,双方各自保存私钥和公钥。API接口中常体现于【APP_ID,APP_KEY|APP_SECRET】
Token 生成算法:
/**
* 生成token
* @param $user_info string
* @param $app_key string app_key
* @param $app_id int app_id
* @return string
*/
public function generate_access_token($user_info , $app_key, $app_id)
{
$time = time();
$sign = sha1($time . $advertiser_id . $app_key);
$token = base64_encode("{$time},{$user_info },{$app_id},{$sign}");
return $token;
}
Token解析方法:
解密的方法中对时效性做了一分钟的验证,实际项目中可以根据情况开放失效的设置。
/**
* 解析token
* @param $access_token
* @return array
*/
public function analysis_access_token($access_token)
{ $token_array = base64_decode($access_token);
$token_array = explode(',', $token_array);
$time = $token_array[0];
$user_info = $token_array[1];
$app_id = $token_array[2];
$sign = $token_array[3]; if ($time < (time() - 60) || $time > (time() + 60)) {
call_back(1101, 'Access Token expire !token=' . $access_token);
} global $third_platform_app_key;// app_id-app_key对应表 if (!isset($third_platform_app_key[$app_id])) {
call_back(1101, 'Access Token App id Error!token=' . $access_token);
} $app_key = $third_platform_app_key[$app_id]; $local_sign = sha1($time . $user_info . $app_key); if ($local_sign === $sign) {
return [
'access_token' => $access_token,
'user_info' => $user_info,
'time' => $time,
'app_id' => $app_id,
'app_key' => $app_key,
];
} else {
call_back(1101, 'Access Token Sign Error!token=' . $access_token);
}
}
改Token方式要求每次请求都需要生成新的token来确保请求的时效性
另外:为了加强API接口请求的完整性,我们也会对请求内容进行字段排序后摘要验证。(详情参考:https://open.taobao.com/docV2.htm?docId=101617&docType=1)
今天的普及到这里就结束啦,谢谢大家,也欢迎大家留言讨论。
API 接口设计中 Token 类型的分类与设计的更多相关文章
- 教你避雷!网页设计中常见的17个UI设计错误集锦(附赠设计技巧)
以下内容由摹客团队翻译整理,仅供学习交流,摹客iDoc是支持智能标注和切图的产品协作设计神器. 精心设计的用户界面对网站意义重大.具备所有最新功能和响应式设计有助于提高网站的搜索引擎排名,从而增加受众 ...
- Python+request 登录接口reponse中token传递给其他接口使用,小示例介绍《一》
要求: 1.调用登录login 2.调用通过登录接口返回的reponse中的token和uuid,实现test_create_todo接口的测试 实现: 1.login登录接口的调用,直接填写对应的U ...
- python+requests----登录接口reponse中token传递给其他接口使用的一个简单小示例介绍
#!/usr/bin/env python # coding=UTF-8 import requests def login(): url = "https://xxxx.xxx.xxx/v ...
- Winform混合式开发框架访问Web API接口的处理
在我的混合式开发框架里面,集成了WebAPI的访问,这种访问方式不仅可以实现简便的数据交换,而且可以在多种平台上进行接入,如Winform程序.Web网站.移动端APP等多种接入方式,Web API的 ...
- c++中的类型擦除
(原创)c++中的类型擦除 c++11 boost技术交流群:296561497,欢迎大家来交流技术. 关于类型擦除,可能很多人都不清楚,不知道类型擦除是干啥的,为什么需要类型擦除.有必要做个说明,类 ...
- 网页截图API接口,一键自动生成网页截图
背景 最近在开发一个小程序,其中有一个帮助模块,内容为帮助文章列表,文章内容为网站后台编辑的富文本格式.鉴于小程序的特殊性,其对html格式的富文本支持并不友好. 刚开始有人开发了wxparse插件, ...
- (原创)c++中的类型擦除
c++11 boost技术交流群:296561497,欢迎大家来交流技术. 关于类型擦除,可能很多人都不清楚,不知道类型擦除是干啥的,为什么需要类型擦除.有必要做个说明,类型擦除就是将原有类型消除或者 ...
- 关于新浪和腾讯短网址API接口的调用
最新新浪t.cn短网址和腾讯url.cn短网址生成api接口,快速生成t.cn及url.cn超短链接,接口都可以正常调用,觉得不错可以收藏一下. 新浪短网址api接口:1. http://yldwz. ...
- FPGA异步时钟设计中的同步策略
1 引言 基于FPGA的数字系统设计中大都推荐采用同步时序的设计,也就是单时钟系统.但是实际的工程中,纯粹单时钟系统设计的情况很少,特别是设计模块与外围芯片的通信中,跨时钟域的情况经常不可避免. ...
随机推荐
- Git学习笔记一--创建版本库、添加文件、提交文件等
Git,是Linus花了两周时间用C写的一个分布式版本控制系统.牛该怎么定义? 其实,很多人都不care谁写了Git,只在乎它是免费而且好用的!So do I! 下面开始我们的学习: 1.Git安装( ...
- poj 1274 The Perfact Stall
click here ~~ ***The Perfect Stall*** Description Farmer John completed his new barn just last week, ...
- 算法笔记_090:蓝桥杯练习 7-1用宏求球的体积(Java)
目录 1 问题描述 2 解决方案 1 问题描述 问题描述 使用宏实现计算球体体积的功能.用户输入半径,系统输出体积.不能使用函数,pi=3.1415926,结果精确到小数点后五位. 样例输入 一个 ...
- 微信小程序innerAudioContext接口
voice:function(){ var word = this.data.word; var src = 'https://--/'+word['word']+'.mp3'; console.lo ...
- 约瑟夫环 java实现
问题: N个人从1到N编号.围城一圈,从1開始报数, 数到X时,将X的编号输出,并将那个人踢出, 下一个从1再開始报数,直到全部人都出去 思路: 就是计数.移除,没有太深的思想,直接上代码: pack ...
- Debian9.3安装NW360无线网卡驱动
最近想把家里的一台老旧台式机利用起来,打算安装Debian9.3,下载ISO,用PowerISO写入到U盘,然后开始安装,过程基本顺利. 就是中间提示缺少“rtl_nic/rtl8105e-1.fw” ...
- 如何为Drupal缓存对象指定缓存类?
什么意思?意思是说,假如你有这样的需求,需要将cache_page缓存到数据库,其它的都缓存到memcache,这该怎么办? 看看_cache_get_object()的实现你就会知道上面的问题该怎么 ...
- DataTable转换成匿名类的List类型
DataTable转换成匿名类的List类型 因为匿名类是不能够 Activator.CreateInstance进行反射实例化的 /// <summary> /// 匿名类的转换方式 ...
- 自制MVC框架CRUD操作、列表、分页显示插件介绍
这里涉及到的操作都是引用自Stephen.DALService数据层.数据访问层实现方式在后文中我会仔细的说明,先说明一下数据操作集成的插件. 1).InsertAttribute 用于插入记录. 状 ...
- Mobicents记录1:如何搭建和运行mobicents3.0环境(基于jboss7.2)
网上能查到的mobicents的资料都是基于比较老的版本,而官网现在已经更新到3.0的版本,很多资料都已经无效,所以把自己的摸索过程记录下来,以便后来者能少走点弯路,快速上手. 闲言少叙,开始正文.. ...