在实际的网站设计中我们经常会遇到用户数据的验证和加密的问题,如果实现单点,如果保证数据准确,如何放着重放,如何防止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 类型的分类与设计的更多相关文章

  1. 教你避雷!网页设计中常见的17个UI设计错误集锦(附赠设计技巧)

    以下内容由摹客团队翻译整理,仅供学习交流,摹客iDoc是支持智能标注和切图的产品协作设计神器. 精心设计的用户界面对网站意义重大.具备所有最新功能和响应式设计有助于提高网站的搜索引擎排名,从而增加受众 ...

  2. Python+request 登录接口reponse中token传递给其他接口使用,小示例介绍《一》

    要求: 1.调用登录login 2.调用通过登录接口返回的reponse中的token和uuid,实现test_create_todo接口的测试 实现: 1.login登录接口的调用,直接填写对应的U ...

  3. python+requests----登录接口reponse中token传递给其他接口使用的一个简单小示例介绍

    #!/usr/bin/env python # coding=UTF-8 import requests def login(): url = "https://xxxx.xxx.xxx/v ...

  4. Winform混合式开发框架访问Web API接口的处理

    在我的混合式开发框架里面,集成了WebAPI的访问,这种访问方式不仅可以实现简便的数据交换,而且可以在多种平台上进行接入,如Winform程序.Web网站.移动端APP等多种接入方式,Web API的 ...

  5. c++中的类型擦除

    (原创)c++中的类型擦除 c++11 boost技术交流群:296561497,欢迎大家来交流技术. 关于类型擦除,可能很多人都不清楚,不知道类型擦除是干啥的,为什么需要类型擦除.有必要做个说明,类 ...

  6. 网页截图API接口,一键自动生成网页截图

    背景 最近在开发一个小程序,其中有一个帮助模块,内容为帮助文章列表,文章内容为网站后台编辑的富文本格式.鉴于小程序的特殊性,其对html格式的富文本支持并不友好. 刚开始有人开发了wxparse插件, ...

  7. (原创)c++中的类型擦除

    c++11 boost技术交流群:296561497,欢迎大家来交流技术. 关于类型擦除,可能很多人都不清楚,不知道类型擦除是干啥的,为什么需要类型擦除.有必要做个说明,类型擦除就是将原有类型消除或者 ...

  8. 关于新浪和腾讯短网址API接口的调用

    最新新浪t.cn短网址和腾讯url.cn短网址生成api接口,快速生成t.cn及url.cn超短链接,接口都可以正常调用,觉得不错可以收藏一下. 新浪短网址api接口:1. http://yldwz. ...

  9. FPGA异步时钟设计中的同步策略

    1 引言    基于FPGA的数字系统设计中大都推荐采用同步时序的设计,也就是单时钟系统.但是实际的工程中,纯粹单时钟系统设计的情况很少,特别是设计模块与外围芯片的通信中,跨时钟域的情况经常不可避免. ...

随机推荐

  1. 【Firefly API文档】—— Package DBentrust

    http://bbs.gameres.com/thread_219653_1_1.html package dbentrust 该包下面主要是数据库的处理与memcached存储.里面封装了,从mem ...

  2. Mysql 如何查询两个时间段之间的数据?

    Mysql 如何查询两个时间段之间的数据?

  3. odoo8.0下selection_add的使用

    在odoo中有selection类型的字段,用于限定字段的值在某些范围之内,在view上面显示此字段时,会显示一个下拉的列表. 如果是自己新定义的字段,这个列表的内容可以自己定义,但如果是继承自某个对 ...

  4. struts2 常用标签

    版权声明:本文为博主原创文章,未经博主允许不得转载. Struts2可以将所有标签分成3类: 准备工作:需要在JSP页面引入标签库 <%@ taglib prefix="s" ...

  5. mongodb进阶三之mongodb管理

    http://blog.csdn.net/stronglyh/article/details/46827141 平时的开发环境win比較多啊,但生产环境要放到unix环境上 一:命令 安装就不少了,网 ...

  6. checkbox 全选操作

    <html> <head></head> <body> <div id="places"> <input type ...

  7. 浅析C#中 ConcurrentDictionary的实现

    简单画了一张图 (灵魂画手 →_→) 如图 ConcurrentDictionary 其中有个tables 对象主要存储,而这个 tables 是一个 很多区块的 数组 ,每个区块 又是一个node的 ...

  8. 让python cookie支持特殊字符

    让python cookie支持特殊字符 先对cookie做下简单的介绍 cookie的作用: tcp协议能够通过三次握手建立连接.client发送的多次请求能够通过句柄维护同一个连接.可是http协 ...

  9. 【JS设计模式】装饰者模式

    装饰者模式:在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能.它是通过创建一个包装对象,也就是装饰来包裹真实的对象 装饰模式的特点 (1) 装饰对象和真实对象有同样的接口.这样clien ...

  10. iptables 使用

    原文链接 本文介绍25个常用的iptables用法.如果你对iptables还不甚了解,可以参考上一篇iptables详细教程:基础.架构.清空规则.追加规则.应用实例,看完这篇文章,你就能明白ipt ...