单点登录即Signle Sign On,简称SSO。其解决的是用户在多个站点之间跳转时需要频繁登录的问题,比如用户登录了天猫,就应该无需再使用账号登录淘宝,它们之间是可以相互信任的,应该自动同步登录状态。从这点上看单点登录技术的本质是登录状态在多个站点之间的扩散机制。

先来看下单个程序的登录处理流程,这里以Web应用程序为例。在单个Web应用程序中用户通过浏览器提交账号信息到后端服务,后端服务验证账号的有效性,验证通过后在后端创建一个Session,用来维持用户的登录状态,然后向前端返回一个SessionId,前端将这个SessionId保存起来,这个保存操作一般是写入当前域名对应的Cookie,之后每次请求Web页面的时候都要携带这个SessionId,后端服务根据这个SessionId就能识别是哪个用户,然后就可以进行对应的业务处理。具体登录流程如下图所示:

那如何在多个站点之间共享登录状态呢?如果是同一个顶级域名下的不同子域名站点,可以通过共享Cookie的方式,具体操作就是设置Cookie的Domain属性为同一个顶级域名,则各个站点都能获取到这个Cookie,也就能获取到同一个Session,实现登录状态的共享。不过这种方式的普适性不太好,不同的域名之间就做不到,而且共享Cookie安全性上也会有点问题。

本文将介绍一种更通用的单点登录方式,通过引入一个SSO站点,所有的登录请求和登录状态同步请求都交给这个站点来处理。这里假设有两个站点需要同步登录状态:站点A 和 站点B,用户访问站点A时没有登录过,需要在SSO站点先登录,然后登录状态同步到站点A,访问站B时,因为用户已经登录过,所以只需要将登录状态同步到站点B即可。一图胜千言,下面给出详细的时序图,并做一些关键步骤说明,具体过程稍微有些复杂,不过仔细阅读,还是比较容易理解的。

步骤5: 用户在业务站点未登陆时,统一重定向到SSO站点的登录页面。这里有一点需要注意:重定向时需要携带用户访问A站点的地址,这样成功登录后才能跳转回来。

步骤6和步骤27: 重定向到SSO站点时,有两点需要注意:一是要检查来源,如果不是允许的业务站点,则应该拒绝请求,这样比较安全;二是会检查用户在SSO站点的登录状态,如果登录过,浏览器会在HTTP请求头中携带SessionId的Cookie,根据这个SessionId可以判断用户登录状态是否有效,如果有效则给业务站点返回一个Ticket,如果无效则返回登录页面内容,需要用户先通过账号登录成功,然后再给业务站点返回Ticket。

步骤15和步骤30: 业务站点收到SSO站点的Ticket之后,还要使用事先分配好的密钥计算一个签名,这个密钥每个站点应该不同,业务站点后台携带这个Ticket和签名去SSO站点进行验证。Ticket是SSO站点发放的,自然能够验证其有效性;密钥也是SSO站点发放的,根据签名的计算规则再算一遍,对比下就知真伪了。然后告知业务站点你可以登录了,并发送必要的用户信息。之所以会有这个步骤,是因为来源的验证不是那么可靠,密钥每家独一份,安全性就高了很多。

步骤18和步骤33: 业务站点都需要创建自己的用户Session,然后在浏览器写入对应业务站点的SessionId Cookie。这个Session在服务端可以分别存储,如果业务规模不大也可以使用同一份存储,统一存储时登录状态可以统一管理。

当前有很多的站点使用JWT做登录认证,这样有个好处就是分布式环境下不需要集中认证,每个部署节点都拥有完全的认证能力,不过如果需要注销用户的时候,就很难实现同步注销。有一些解决方案,比如认证Token的生存期短一点,再增加一个刷新Token,刷新Token时访问集中的认证服务;或者使用一个高效的黑名单机制,每次都检查黑名单等。如果业务规模不是很大,都不如统一Session的机制简单,比如使用Redis存储Session信息,轻松处理千级万级并发。

以上就是本文的全部内容了,重点就是那张单点登录的时序图,想不明白的时候可以多撸几遍,如有错漏欢迎指正。

收获更多架构知识,请关注公众号 萤火架构。原创内容,转载请注明出处。

一图搞懂Web应用的单点登录的更多相关文章

  1. 一张图搞懂Spring bean的完整生命周期

    一张图搞懂Spring bean的生命周期,从Spring容器启动到容器销毁bean的全过程,包括下面一系列的流程,了解这些流程对我们想在其中任何一个环节怎么操作bean的生成及修饰是非常有帮助的. ...

  2. 一篇文章彻底弄懂CAS实现SSO单点登录原理

    1. CAS 简介 1.1. What is CAS ? CAS ( Central Authentication Service ) 是 Yale 大学发起的一个企业级的.开源的项目,旨在为 Web ...

  3. 八幅漫画理解使用JSON Web Token设计单点登录系统

    用jwt这种token的验证方式,是不是必须用https协议保证token不被其他人拦截? 是的.因为其实只是Base64编码而已,所以很容易就被解码了.如果你的JWT被嗅探到,那么别人就可以相应地解 ...

  4. 八幅漫画理解使用 JSON Web Token 设计单点登录系统

    原文出处: John Wu 上次在<JSON Web Token – 在Web应用间安全地传递信息>中我提到了JSON Web Token可以用来设计单点登录系统.我尝试用八幅漫画先让大家 ...

  5. [转]八幅漫画理解使用JSON Web Token设计单点登录系统

    上次在<JSON Web Token - 在Web应用间安全地传递信息>中我提到了JSON Web Token可以用来设计单点登录系统.我尝试用八幅漫画先让大家理解如何设计正常的用户认证系 ...

  6. 使用JSON Web Token设计单点登录系统

    用户认证八步走 所谓用户认证(Authentication),就是让用户登录,并且在接下来的一段时间内让用户访问网站时可以使用其账户,而不需要再次登录的机制. 小知识:可别把用户认证和用户授权(Aut ...

  7. 使用JSON Web Token设计单点登录系统--转

    原文地址:https://leon_lizi.gitbooks.io/json-web-token/content/chapter2.html 用户认证八步走 所谓用户认证(Authenticatio ...

  8. 身份认证系统(二)多WEB应用的单点登录

    随着互联网的发展,web应用的复杂度也一直在提升,慢慢的单一的web应用已经不能满足复杂的业务需求.例如百度的搜索.新闻.百科.贴吧,其实本质上都是不同的网站.当用户使用这些平台的时候,我们当然不希望 ...

  9. 一张图搞懂容器所有操作 - 每天5分钟玩转 Docker 容器技术(26)

    前面我们已经讨论了容器的各种操作,对容器的生命周期有了大致的理解,下面这张状态机很好地总结了容器各种状态之间是如何转换的. 如果掌握了前面的知识,要看懂这张图应该不难.不过有两点还是需要补充一下: 可 ...

随机推荐

  1. 巩固javaweb的第二十四天

    巩固内容: 提示用户信息 在验证失败之后通常需要提示用户错误信息,可以通过下面的代码完成: alert("地址长度大于 50 位!"); 当使用 alert 提示错误信息时,参数是 ...

  2. day06 HTTP协议

    day06 HTTP协议 HTTP协议 什么是http? HTTP 全称:Hyper Text Transfer Protocol 中文名:超文本传输协议 是一种按照URL指示,将超文本文档从一台主机 ...

  3. day22面向对象编程思想

    day22面向对象编程思想 1.面向过程 面向过程: 核心是"过程"二字 过程的终极奥义就是将程序流程化 过程是"流水线",用来分步骤解决问题的 面向对象: 核 ...

  4. 【Reverse】DLL注入

    DLL注入就是将dll粘贴到指定的进程空间中,通过dll状态触发目标事件 DLL注入的大概流程 https://uploader.shimo.im/f/CXFwwkEH6FPM0rtT.png!thu ...

  5. pyqt5 的串口编写进度

    2020.12.18 今天遇到一个问题, 想用回车实现串口数据的发送. 下面这句话是让光标移动到文字的尾部,但是不能够实现. 对QTextEdit控件中的文字改写,或清除后,再调用下面的移动到尾部,就 ...

  6. mybatis-plus解析

    mybatis-plus当用lambda时bean属性不要以is/get/set开头,解析根据字段而不是get/set方法映射

  7. fastJson序列化

    在pojo实体中有map<String,Object>的属性,有个key是user它存储在数据库中是用户的id数组,而在aop里会对这个属性做用户详细信息查询并重新put给user.在做J ...

  8. 【Linux】【Basis】磁盘分区

    1. Linux磁盘及文件系统管理 1.1. 基本概念: 1.1.1. 磁盘接口类型: IDE(ata):并口,133MB/s,设备/dev/hd[a-z] SCSI:并口,Ultrascsi320, ...

  9. Spring 的 init-method 和 destory-method

    关于在spring  容器初始化 bean 和销毁前所做的操作定义方式有三种 第一种注解: 通过@PostConstruct 和 @PreDestroy 方法 实现初始化和销毁bean之前进行的操作 ...

  10. HDC2021技术分论坛:如何高效完成HarmonyOS分布式应用测试?

    作者:liuxun,HarmonyOS测试架构师 HarmonyOS是新一代的智能终端操作系统,给开发者提供了设备发现.设备连接.跨设备调用等丰富的分布式API.随着越来越多的开发者投入到Harmon ...