用户认证指在用户访问服务的时候确认用户的身份,受限于HTTP无状态的特性,应用开发者需要自行实现用户认证相关功能。

通常是用户登录时服务端生成通行证返回给客户端,客户端在接下来的请求中携带通行证,然后服务端通过校验该通行证实现用户认证。

不管具体的业务是什么,如果用户认证失败,那么所有的后续操作都无法执行,需要返回给客户端用户认证失败,对应到HTTP Status Code是401。

本文阐述随着流量和规模增长,服务从单机应用发展到微服务架构的过程中,用户认证功能的实现方式变迁。

单机应用

这个阶段只有一台服务器,应用将session维护在本机的内存/磁盘,然后生成一个session id告之客户端即可。很多Web框架有内置的实现,开箱即用,有时间简单到你都没注意到用户认证的存在。

但是一台应用服务器往往不够用,有多个理由:流量太大一台扛不住、机器一挂服务就挂可用性太低...

负载均衡

因为有多台服务器,所以没法再简单地将session维护在本机上,因为用户在一台机器上登录后,下次访问可能就到了另一台机器。

  • 方案A:认证令牌

在登录的时候将一些用户的信息编码到一个字符串里返回给客户端,客户端在随后的操作中携带此字符串操作,服务端验证这个字符串,字符串合法则认证通过并从字符串中读取用户身份信息。

这样就不需要服务端再存储session信息,轻松支持多台服务器。而这个用来认证的字符串,就跟军队的通关令牌一样,我们管它叫认证令牌。

认证令牌的格式需要仔细设计,要能防篡改、具备有效期、要能放到URL中使用、还要可扩展等等。已经有人设计了好了一种令牌格式,还形成了标准叫JWT,可以直接拿来用,当然要是嫌JWT不好用,重新设计一个也是可以的。

这里有一份JWT的简明介绍。

认证令牌这个方案的缺点是,难以实现登录态的云端管理。通常一个令牌生成后,只能等它过期或者encode在其中的某些用户身份信息发生变化的时候才会生效。像用户退登就失效、用户的在线设备管理、用户的登录态管控等功能,没有办法实现。

  • 方案B:分布式Session

还有一种方案,将session从应用服务器拿出来单独维护,形成一个分布式session,这样每一台应用服务器都能访问得到。

具体到实现,分布式Session可以是Redis、MySQL等。但不管用什么样的存储系统,用户认证服务的可用性都强依赖它,相比认证令牌不需要服务端存储的方案,可用性肯定相对要低一些。

  • 方案A+B

认证令牌有功能缺失,分布式Session可用性相对不足,把两者结合起来就成了顺利成章的方案。

将认证令牌当做session id,正常服务时,用户认证都做分布式session校验,而当分布式session依赖的存储系统偶尔出现故障时,则服务降级,改为只校验认证令牌。这样可用性有保障,功能也齐全。

如果需要保证登录服务时,分布式Session也是高可用的,还可以在令牌里面增加一个字段用来区分有session和无session的类型。

微服务

业务规模越来越大,团队人数越来越多。一起维护同一个服务越来越难了,需要服务拆分,但不管怎么拆,用户认证是每个面向终端用户的服务都需要的。

用户认证都需要,只要在拆分的时候把相关代码都拷贝走,然后各个服务都要依赖用户信息和分布式session。

这样维护起来困难太大,只好将用户认证相关的功能拆分出来,形成一个独立的用户认证服务。这个服务几乎每一个大点的互联网公司都有,名字不太一样,有的叫Passport,有的叫Account,有的叫User,但总归功能是差不多的。

这样登录、注册、用户认证相关的代码、数据、线上部署,完全独立出来,形成一个用户认证服务。然后随着业务增长,服务会继续拆分,越来越多。服务之间可能有依赖,然后大部分服务尤其是面向终端用户的服务都会依赖用户认证服务。

依赖用户认证服务的独立微服务越来越多,重复的对接工作需要进行很多次,另外在用户的一次请求中往往涉及多个微服务,在各个微服务单独对接用户认证的情况下,难免会进行多次用户认证,造成重复请求,资源浪费。

API网关

通过外网API网关,将公司所有的对外接口的签名和用户身份认证收拢到一起。API网关收到用户的认证令牌之后,先去用户认证服务换取用户id,然后使用用户id访问其它微服务。这样各个微服务都根据用户uid提供服务,不再需要关心终端用户的身份认证,而用户认证服务也只需要对接API网关即可,各自的工作量都大大减小。

Reference

https://www.slideshare.net/opencredo/authentication-in-microservice-systems-david-borsos

原文链接:https://www.cnblogs.com/xinzhao/p/11571907.html


.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com

从单机应用到微服务,用户认证走几步?相关推荐

  1. 如何删除网关的session_微服务安全认证架构是如何演进而来的?坐好小板凳一起来听一听...

    之前有同事问为何要用基于JWT令牌的认证架构,然后近期又有童鞋在后台留言问微服务安全认证架构的实践,因此我决定花两篇推文来解答一下.为了答好这个话题,我们先来看看微服务的安全认证架构是如何演进而来的, ...

  2. SpringSecurity-基于微服务的认证与权限访问

    目录 一.微服务概述 1.1 微服务由来 1.2 微服务优势 1.3 微服务本质 1.4 微服务的认证与授权实现思路 1.5 权限管理数据模型(举例) 二.JWT概述 2.1 Sesssion认证与T ...

  3. 【Spring Cloud Alibaba 实战 | 总结篇】Spring Cloud Gateway + Spring Security OAuth2 + JWT 实现微服务统一认证授权和鉴权

    一. 前言 hi,大家好~ 好久没更文了,期间主要致力于项目的功能升级和问题修复中,经过一年时间这里只贴出关键部分代码的打磨,[有来]终于迎来v2.0版本,相较于v1.x版本主要完善了OAuth2认证 ...

  4. SpringCloud+OAuth2+Redis实现的微服务统一认证授权

    作者:myCat blog.csdn.net/WYA1993/article/details/85050120 开发环境: Windows10 Intellij Idea2018.2 jdk1.8 r ...

  5. SpringCloud工作笔记038---spring cloud微服务权限认证_终于确定下来大体的思想了

    JAVA技术交流QQ群:170933152 智慧城市: 现在权限这块,这样做: 微服务架构: 网关微服务:sc-gateway 认证微服务:sc-auth 权限微服务:sc-permission 思想 ...

  6. 6小时精通springcloud第09讲:微服务安全认证

    本课时我们主要讲解服务器架构安全认证及常见的认证方式.JWT 认证.Token 的使用注意事项,以及内部服务之间的认证等内容. 微服务架构安全认证 随着单体应用架构到微服务架构的演进,应用的访问安全问 ...

  7. 从零开始搭建微服务:认证服务器

    通常的,单体架构,我们会采用Shiro对系统做防护以及权限控制.在搭建微服务系统时,同样也要对资源做保护,只有通过认证的资源才能被访问.下面,我们将借助Spring Cloud OAuth和Sprin ...

  8. SpringCloud+SpringBoot+OAuth2+Spring Security+Redis实现的微服务统一认证授权

    因为目前做了一个基于Spring Cloud的微服务项目,所以了解到了OAuth2,打算整合一下OAuth2来实现统一授权.关于OAuth是一个关于授权的开放网络标准,目前的版本是2.0,这里我就不多 ...

  9. 微服务——用户微服务单点登录

    用户微服务单点登录 为什么要使用单点登录原理 链接:https://blog.csdn.net/weixin_45528987/article/details/105365115 架构图 看图可能还有 ...

最新文章

  1. 爬取 爱笔智能 招聘职位
  2. 思科CCNA考试实验常用的命令
  3. python开发web运维工具_Python web 开发工具箱
  4. Vue监听滚动条事件 点击回到顶部
  5. 当你不知道今天星期几,不妨在编辑器写下这段代码
  6. 带你理解Spring AOP
  7. 惊爆:各大 App 可直接打开小程序!微信收割移动互联网的时间开始了
  8. 基于SpringBoot大学生数码租赁网站答辩PPT模板
  9. Skyfree退休公告
  10. java文件复制后是乱码_复制Java源文件到MyEclipse后乱码问题怎么解决?
  11. 古城钟楼微博地支报时程序铛,100行代码实现,价值一天20万粉丝
  12. 阿里面试:设计一个电商平台积分兑换系统!
  13. c语言switch购物折扣,SWITCH国际版ESHOP史低来袭推荐(64):精彩在继续,折扣在进行,捡漏的机会到啦!...
  14. iOS 【使用自定义字体-苹方字体】
  15. 常用英雄胜率怎么刷_王者荣耀怎么刷英雄胜率和场次胜率方法解析
  16. 49天精通Java,第12天,Java接口的作用和意义
  17. Smarty的基本使用与总结
  18. 淘宝API接口大纲,引领企业信息化
  19. 从mkv文件中提取src格式等字幕流
  20. 思科防火墙——实验练习加命令

热门文章

  1. 将Teams app升级到net6
  2. Java版本的Bot Framework SDK
  3. 如何使用wink框架_如何解决Wink Hub的Z-Wave连接问题
  4. 99. Recover Binary Search Tree
  5. 用websploit获取管理员后台地址
  6. 使用SMART监控Ubuntu
  7. oracle导出数据库中表出现导出报错(EXP-00003)未找到段 (0,0) 的存储定义
  8. MySQL使用详解--根据个人学习总结
  9. 五大原则之----里氏替换原则(LSP)
  10. 关于商品分类 商品表和属性表的设计