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个客户端的格局 . 不同的客户端产生了不同的用户使用 ...
随机推荐
- PHP 设计模式(一)
基础的三种设计模式 工厂模式 为创建对象提供了一个统一的接口,好处是当被创建对象命名空间或者名称改变时,直接修改工厂的创建方法即可 <?php class Factory{ public sta ...
- sendmail报错Relaying denied
配置好sendmail后,使用php的mail()发送邮件,出现 SMTP server response: 550 5.7.1 Relaying denied. IP name lookup fai ...
- centos7下 nginx配置upstream 不能直接代理到本机tomcat的解决
Nginx代理本地tomcat时404. upstream是直接配置server localhost:10000 的.单独访问tomcat是可以的. 查看/var/log/nginx/error.lo ...
- 《DOM Scripting》学习笔记-——第二章 js语法
<Dom Scripting>学习笔记 第二章 Javascript语法 本章内容: 1.语句. 2.变量和数组. 3.运算符. 4.条件语句和循环语句. 5.函数和对象. 语句(stat ...
- tensorflow报错error,tf.concat Expected int32, got list containing Tensors of type '_Message' instead
参考:https://stackoverflow.com/questions/41813665/tensorflow-slim-typeerror-expected-int32-got-list-co ...
- int和string之间的转换
#include<cstring> #include<algorithm> #include<stdio.h> #include<iostream> # ...
- SVG绘制太极图
思路:先画一整个圆,填充颜色为黑色,再用一个边框和填充颜色均为白色的长方形覆盖右半边的半圆,再以同一个圆心,相同半径绘制一整个圆,该圆的边线颜色为黑色,没有填充颜色,最后常规操作再画四个小圆 源代码: ...
- gitlab 常用维护命令
GitLab简介 GitLab 是一个用于仓库管理系统的开源项目.使用Git作为代码管理工具,并在此基础上搭建起来的web服务.Github是公共的git仓库,而Gitlab适合于搭建企业内部私有gi ...
- linux上部署Appach,让文件目录以网页列表形式访问
效果: 1.首先,需要安装Apache httpd服务 yum install -y httpd 2.查看或者设置httpd主配文件 vim /etc/httpd/conf/htpd.conf 从中可 ...
- django admin 模块添加 static
目前路径是在 /var/www/jastme/static 但是admin的静态文件不在这个位置,那么怎么办呢? 首先到项目下,就是有manage.py的这个目录 编辑项目下的setting.py 首 ...