API网关设计(一)之Token多平台身份认证方案(转载)
原文:https://segmentfault.com/a/1190000018535570?utm_source=tag-newest
概述
今天咱们面对移动互联网的发展,系统一般是多个客户端对应一个服务端。
客户端统一通过F5或者Nginx代理转发到API网关,最后发送到服务API。
如下图架构图所示
这个过程当中就存在多个很明显需要做的事,如下列表
- 身份认证(登陆以及会话级用户认证)
- 权限认证(当然是认证用户身份之后,确认是否有权限调用API)
- 调用频率控制(限流算法如计数,滑动窗口,漏桶,令牌桶)
- 负载算法(如权重,均衡,例外再比如灰度发布都是同一个思路)
而咱们今天主要讲的了就是身份认证这一块具体怎么设计Token,在前一篇文章中已经描述过整体的登陆逻辑,不清楚的同学可以看一下。
Token设计
如今的系统不可能存在一个token走到底打通所有系统,为啥这么说?
由于不同的客户端,会存在不同的认证场景。
咱们具体看一下分析过程
认证场景
客户端以下几点用户认证的场景
- 移动端登陆,会话API调用
- web端登陆,会话API调用
- 移动端扫码登陆web(如微信扫码)
- 移动端授权登陆(如微信授权)
而通过客户端的认证场景,咱们又能具体推理出功能级别的具体场景如下
- 客户端记住用户密码免登陆认证
- API调用的会话级别认证
- 移动端已登陆授权web端免密登陆
Token设计要点
通过上面的认证场景才能不难得出如下结论
- 多层级Token
- Token之间可向下授权
- Token使用频率
- Token失效时间
级别划分 1~3 分别为低中高
Token | 名称 | 级别 | 使用频率 | 有效期 | 保密级别 | 变化成本 |
---|---|---|---|---|---|---|
webtoken | web端token | 3(持久化) | 1 | >=1天 | 3 | 3 |
mobiletoken | mobile端token | 3(持久化) | 1 | >=1天 | 3 | 3 |
sessiontoken | 会话token | 2(会话级) | 3 | 分钟级别 | 3 | 1 |
accesstoken | API认证token | 1(短暂认证) | 3 | 秒级 | 2 | 1 |
再具体看一张token层级架构图
为啥要将token分这么多类型了?
咱们先根据上图捋一下思路具体如下几步
- 用户名和密码认证获取webtoken或者mobiletoken
- 用户登原先存在webtoken或mobiletoken可以拿到sessiontoken
- 通过sessiontoken可以去拿去短暂的accesstoken
- 通过accesstoken可以调用API
层级token优势
通过上面咱们可以看出来最终调用api是通过accesstoken,那么咱们为什么还需要设计
多层token了?主要有以下几个原因
- 不同的客户端对于免登陆的要求是不一样的,比如web端输入一个用户名密码或者通过手机接受一个验证码是很方便的事情,所以token时间不会存放特别长。但是对于移动端来说,对于用户体验比较好的情况就是随时随刻都是登陆状态,输入一次密码最好能用个大半年。
- 安全性考虑这一点是由于第点的原因导致,由于webtoken或者mobiletoken存储在客户端的时间较长。如果调用频率很高,及其容易导致被抓包获取到黑客手中。因此引入了会话级别token通过持久化在客户端的mobiletoken等去获取。会话token的特点就是调用频率高,失效时间快,就算被被人拿到了不会造成奔溃式的问题出现。
- 统一后台api调用控制,accesstoken的存在是真正调用api的token,也是通过sessiontoken获取。为了不同客户端统一接入api实现,如果acesstoken不统一。那代码层面实现又全部耦合到了一起,如果是统一的就可以将代码抽出来一个层级放在网关统一实现。
综合上面可以总结出来的优势有如下几点
- 解耦系统 (accesstoken网关之后的系统可以任意部署)
- 提高系统扩展性(可以接入不同性质的客户端)
- 层级清楚便于维护(token分层代码,便于独立维护)
token安全控制
首先咱们得明白一个道理对于任何登陆系统来说根本就不存在百分百的安全,唯一可以做到的就是提高破解成本。具体的安全控制方法我的总结如下
- 使用https哪怕被抓包看到的也是加密数据,除非客户端和服务端都被黑了。这尼玛这人这么优秀,干点啥不好。。。
- 根据业务要求设置不同token失效时间,token失效时间越短越安全,用户体验也会有所下滑
- token可以根据动态加密算法以及密码定时更新,然后通过cookie打回客户端
- 移动端可以获取设备id以及ip,当短时间内出现同一账号不同设备请求,及时失效所有token,或者发出告警短信给用户,权限级别较高的操作禁用。
- 移动端加入人脸或者指纹识别
完整架构图
API网关设计(一)之Token多平台身份认证方案(转载)的更多相关文章
- 基于token的多平台身份认证架构设计
基于token的多平台身份认证架构设计 1 概述 在存在账号体系的信息系统中,对身份的鉴定是非常重要的事情. 随着移动互联网时代到来,客户端的类型越来越多, 逐渐出现了 一个服务器,N个客户端的格 ...
- OpenResty api网关设计
本文讲述 OpenResty api网关设计,主要涉及api网关介绍.openresty api网关 请求路由(路由判断.路由重写.服务判断.限流).授权验证(统一认证).动态Upstream 以及这 ...
- ASP.NET Web API 2系列(四):基于JWT的token身份认证方案
1.引言 通过前边的系列教程,我们可以掌握WebAPI的初步运用,但是此时的API接口任何人都可以访问,这显然不是我们想要的,这时就需要控制对它的访问,也就是WebAPI的权限验证.验证方式非常多,本 ...
- 在ASP.NET Core中实现一个Token base的身份认证
注:本文提到的代码示例下载地址> How to achieve a bearer token authentication and authorization in ASP.NET Core 在 ...
- [转]NET Core中实现一个Token base的身份认证
本文转自:http://www.cnblogs.com/Leo_wl/p/6077203.html 注:本文提到的代码示例下载地址> How to achieve a bearer token ...
- NET Core中实现一个Token base的身份认证
NET Core中实现一个Token base的身份认证 注:本文提到的代码示例下载地址> How to achieve a bearer token authentication and au ...
- webapp用户身份认证方案 JSON WEB TOKEN 实现
webapp用户身份认证方案 JSON WEB TOKEN 实现Deme示例,Java版 本项目依赖于下面jar包: nimbus-jose-jwt-4.13.1.jar (一款开源的成熟的JSON ...
- 基于session和token的身份认证方案
一.基于session的身份认证方案 1.方案图示 2.比较通用的鉴权流程实现如下: 在整个流程中有两个拦截器. 第一个拦截器AuthInteceptor是为了每一次的请求的时候都先去session中 ...
- WebApi 基于token的多平台身份认证架构设计
1 概述 在存在账号体系的信息系统中,对身份的鉴定是非常重要的事情. 随着移动互联网时代到来,客户端的类型越来越多, 逐渐出现了 一个服务器,N个客户端的格局 . 不同的客户端产生了不同的用户使用 ...
随机推荐
- 批量移动AD用户到指定OU
原文链接:http://blog.51cto.com/shubao/1346469 作为域管理员,在日常工作中使用ADUC(AD用户和计算机)工具在图形界面中进行账号管理操作可谓是家常便饭了.然而一个 ...
- leetcode114
class Solution { public: void flatten(TreeNode* root) { while(root){ if(root->left){ TreeNode* pr ...
- block引用外部变量原理
block在赋值时才会生成对应的block结构体实例(结构体数据结构在编译时已经生成),赋值时会扫一遍里面引用的外部变量(嵌套block中的外部变量也算,只不过嵌套block中的外部变量会被内外两个b ...
- Helm简介
什么是Helm 微服务和容器化给复杂应用部署与管理带来了极大的挑战.Helm是目前Kubernetes服务编排领域的唯一开源子项目,作为Kubernetes应用的一个包管理工具,可理解为Kuberne ...
- docker 入门第一步
docker 安装 利用yum 安装 yum 源更新到最新版本,命令: yum update 需要安装工具 net-tools 命令:yum install -y net-tools 配置docke ...
- html背景图星际导航图练习
html <body> <div class="box1"> <div></div> ...
- 小程序微信支付java
https://blog.csdn.net/qq_33452819/article/details/70314204#
- LINQ之let关键字
let子句用于在LINQ表达式中存储子表达式的计算结果.let子句创建一个范围变量来存储结果,变量被创建后,不能修改或把其他表达式的结果重新赋值给它.此范围变量可以再后续的LINQ子句中使用. 实例1 ...
- 《java与模式》阅读笔记02
java语言的接口 在之前的编程作业中,我或多或少都用到了java的接口,但是接口的具体意思是什么,又该如何更好的使用呢?这个确实一知半解,带着这个问题我读了关于这些内容的章节. 所谓接口(inter ...
- scrapy+redis去重实现增量抓取
class ProjectnameDownloaderMiddleware(object): # Not all methods need to be defined. If a method is ...