在实际的网站设计中我们经常会遇到用户数据的验证和加密的问题,如果实现单点,如果保证数据准确,如何放着重放,如何防止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. 实时视频直播客户端技术盘点:Native、HTML5、WebRTC、微信小程序

    1.前言 2017 年 12 月,微信小程序向开发者开放了实时音视频能力,给业内带来广阔的想象空间.连麦互动视频直播技术在 2016 年直播风口中成为视频直播的标配,然而只有在原生的 APP 上才能保 ...

  2. POJ1125 Stockbroker Grapevine 多源最短路

    题目大意 给定一个图,问从某一个顶点出发,到其它顶点的最短路的最大距离最短的情况下,是从哪个顶点出发?须要多久? (假设有人一直没有联络,输出disjoint) 解题思路 Floyd不解释 代码 #i ...

  3. 算法笔记_106:蓝桥杯练习 算法提高 周期字串(Java)

    目录 1 问题描述 2 解决方案 2.1 第一印象解法(80分) 2.2 借鉴网友解法(100分)   1 问题描述 问题描述 右右喜欢听故事,但是右右的妈妈总是讲一些“从前有座山,山里有座庙,庙里有 ...

  4. windows下at命令使用详解

    T命令是Windows XP中内置的命令,它也可以媲美Windows中的“计划任务”,而且在计划的安排.任务的管理.工作事务的处理方面,AT命令具有更强大更神通的功能.AT命令可在指定时间和日期.在指 ...

  5. GitHub页面布局乱了,怎么解决??

    GitHub页面布局乱了,怎么解决?? GitHub乱了,怎么解决?? 一年一度的布局又乱了!!! F12一下下面有东西加载不了,,,, Refused to evaluate a string as ...

  6. RandomForest&ROC

    # -*- coding: utf-8 -*- # __author__ = 'JieYao' from biocluster.agent import Agent from biocluster.t ...

  7. X86服务器、小型机、大型机、塔式、机架式、刀片式服务器、工作站

    ü  服务器分:x86(PC)服务器,小型机(Unix服务器),大型机: pc服务器则主要指基于intel处理器的x86架构,是一个通用开放的系统. UNIX服务器,也就是中国业内习惯上说的小型机,在 ...

  8. 转 OAuth 2.0授权协议详解

    http://www.jb51.net/article/54948.htm 作者:阮一峰 字体:[增加 减小] 类型:转载 时间:2014-09-10我要评论 这篇文章主要介绍了OAuth 2.0授权 ...

  9. Redis 5种数据类型,2种特殊数据处理策略

    5种数据类型 String [html] view plaincopy 1.String   经常使用命令:   除了get.set.incr.decr mget等操作外,Redis还提供了下面一些操 ...

  10. 使用NoSQL Manager for MongoDBclient连接mongodb

    1.安装NoSQL Manager for MongoDB 下载地址:http://www.mongodbmanager.com/download 2.打开client,选server-new mon ...