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的数字系统设计中大都推荐采用同步时序的设计,也就是单时钟系统.但是实际的工程中,纯粹单时钟系统设计的情况很少,特别是设计模块与外围芯片的通信中,跨时钟域的情况经常不可避免. ...
随机推荐
- ffmpeg的新东东:AVFilter
http://blog.csdn.net/niu_gao/article/details/7219641 利用ffmpeg做图像的pixel format转换你还在用libswscale吗?嘿嘿,过时 ...
- 算法笔记_098:蓝桥杯练习 算法提高 盾神与条状项链(Java)
目录 1 问题描述 2 解决方案 1 问题描述 问题描述 有一天,盾神捡到了好多好多五颜六色的珠子!他心想这些珠子这么漂亮,可以做成一条项链然后送给他心仪的女生~于是他用其中一些珠子做成了长度为n ...
- Drupal启动阶段之二:页面缓存
页面缓存是什么意思?有些页面浏览量非常大,而且与状态无关,这类页面就可以使用页面缓存技术.在页面第一次请求完毕以后,将响应结果保存起来.下一次再请求同一页面时,就不需要从头到尾再执行一遍,只需要将第一 ...
- 萌新学习Python爬取B站弹幕+R语言分词demo说明
代码地址如下:http://www.demodashi.com/demo/11578.html 一.写在前面 之前在简书首页看到了Python爬虫的介绍,于是就想着爬取B站弹幕并绘制词云,因此有了这样 ...
- 【服务器时间修改为东八区】包括Apache2和mysql
1.服务器Apache时间修改,可通过修改php.ini进行修改 所以就深入了解了一下, 发现Apache(PHP)的服务器时间时区默认为UTC(Coordinated UniversalTime 世 ...
- linux 常用的命令(转)
常用指令 ls 显示文件或目录 -l 列出文件详细信息l(list) -a 列出当前目录下所有文件及目录,包括隐藏的a(all) mkdir ...
- 【ASP.NET MVC系列】详解View
本篇文章内容属于ASP.NET MVC系列视图篇,主要讲解View,大致内容如下: 1.Views文件夹讲解 2.View种类 3.Razor语法 4.对视图的基本操作 一 Views文件夹 (一 ...
- 自制MVC框架原理介绍
当初用jsp开发程序时,因为很多东西写在一起混淆的,项目做大或者变更的时候就会很吃力,联动性太大,有时修改视图的东西都可能会影响业务逻辑,分层不明确. 后来听说了Struts MVC,做过几个示例,层 ...
- C语言 文件操作
/** *@author cody *@date 2014-08-09 *@description copy text file * FILE *fopen(filename,openmode) * ...
- HTML5 多图上传
HTML5 多图上传 时间 2014-06-05 16:06:29 月小升博客 原文 http://java-er.com/blog/html5-many-image-upload/ 主题 HTM ...