原文: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多平台身份认证方案(转载)的更多相关文章

  1. 基于token的多平台身份认证架构设计

    基于token的多平台身份认证架构设计 1   概述 在存在账号体系的信息系统中,对身份的鉴定是非常重要的事情. 随着移动互联网时代到来,客户端的类型越来越多, 逐渐出现了 一个服务器,N个客户端的格 ...

  2. OpenResty api网关设计

    本文讲述 OpenResty api网关设计,主要涉及api网关介绍.openresty api网关 请求路由(路由判断.路由重写.服务判断.限流).授权验证(统一认证).动态Upstream 以及这 ...

  3. ASP.NET Web API 2系列(四):基于JWT的token身份认证方案

    1.引言 通过前边的系列教程,我们可以掌握WebAPI的初步运用,但是此时的API接口任何人都可以访问,这显然不是我们想要的,这时就需要控制对它的访问,也就是WebAPI的权限验证.验证方式非常多,本 ...

  4. 在ASP.NET Core中实现一个Token base的身份认证

    注:本文提到的代码示例下载地址> How to achieve a bearer token authentication and authorization in ASP.NET Core 在 ...

  5. [转]NET Core中实现一个Token base的身份认证

    本文转自:http://www.cnblogs.com/Leo_wl/p/6077203.html 注:本文提到的代码示例下载地址> How to achieve a bearer token ...

  6. NET Core中实现一个Token base的身份认证

    NET Core中实现一个Token base的身份认证 注:本文提到的代码示例下载地址> How to achieve a bearer token authentication and au ...

  7. webapp用户身份认证方案 JSON WEB TOKEN 实现

    webapp用户身份认证方案 JSON WEB TOKEN 实现Deme示例,Java版 本项目依赖于下面jar包: nimbus-jose-jwt-4.13.1.jar (一款开源的成熟的JSON ...

  8. 基于session和token的身份认证方案

    一.基于session的身份认证方案 1.方案图示 2.比较通用的鉴权流程实现如下: 在整个流程中有两个拦截器. 第一个拦截器AuthInteceptor是为了每一次的请求的时候都先去session中 ...

  9. WebApi 基于token的多平台身份认证架构设计

    1   概述 在存在账号体系的信息系统中,对身份的鉴定是非常重要的事情. 随着移动互联网时代到来,客户端的类型越来越多, 逐渐出现了 一个服务器,N个客户端的格局 . 不同的客户端产生了不同的用户使用 ...

随机推荐

  1. Kubelet bootstrap 流程

    首先,什么是kubelet bootstrap?在安装 k8s worker node 时,基本上 worker 的初始状态仅仅是安装了 docker 和 kubelet,worker 需要一种机制跟 ...

  2. Hibernate 再接触 总结

  3. 利用CCS3渐变实现条纹背景

    本文摘自<CSS揭秘>中国工信出版集团 难题: 不论是在网页设计中,还是在其他传统媒介中(比如杂志和墙纸等),各种尺寸.颜色.角度的条纹图案在视觉设计中无处不在.要想在网页中实现条纹图案, ...

  4. Linux - 文件和目录

    文件和目录(理解) 目标 理解 Linux 文件目录的结构 01. 单用户操作系统和多用户操作系统(科普) 单用户操作系统:指一台计算机在同一时间 只能由一个用户 使用,一个用户独自享用系统的全部硬件 ...

  5. poj 2349 求最小生成树里面第m长的边

    题目链接:https://vjudge.net/problem/POJ-2349 题意: 题目就是要我们找到一个最小的值D,把图里面所有大于D的边去掉之后剩余的连通分支的数量为S.这个就是找这个图里面 ...

  6. [Java核心技术]第四章-对象与类(4.1-4.6总结)

    4.1面向对象程序设计概述 OOP(面向对象编程Object Oriented Programming) OOP中数据第一位,算法第二位. 类 封装:关键在于不能让其他方法直接访问类的实例域,程序仅通 ...

  7. Head First Servlets & JSP 学习笔记 第九章 —— 使用JSTL

    JSTL1.1 不是JSP2.0规范的一部分!你能访问Servlet和JSP API 不意味着你能访问JSTL! 使用JSTL之前,需要将两个文件("jstl.jar" 和 &qu ...

  8. ios tableView的header高度不对

    tableView的header高度不对,一般都是header是从xib加载出来的 第一步: 新建xib的时候选择的是View,当选择 Size 为 Freeform 时,view的约束就变成这样了, ...

  9. 初始Spring mvc

    转自:http://elf8848.iteye.com/blog/875830很棒的一篇博客,想了解SpringMvc的入门选手可以去看看. 一,核心类与接口: DispatcherServlet - ...

  10. ipv6 docker

    DOCKER, IPV6 BASIC CONFIGURATION OF DOCKER ENGINE WITH IPV6 SEPTEMBER 21, 2015 EYEPV6(AT)GMAIL(DOT)C ...