专栏首页前端食堂图解单点登录

图解单点登录

概念

单点登录( Single Sign On ,简称 SSO),是目前比较流行的企业业务整合的解决方案之一,用于多个应用系统间,用户只需要登录一次就可以访问所有相互信任的应用系统。

前置介绍

  1. 同源策略 限制了从同一个源加载的文档或脚本如何与来自另一个源的资源进行交互,要求协议,端口和主机都相同。
  2. HTTP 用于分布式、协作式和超媒体信息系统的应用层协议。HTTP 是无状态协议,所以服务器单从网络连接上无从知道客户身份。那要如何才能识别客户端呢?给每个客户端颁发一个通行证,每次访问时都要求带上通行证,这样服务器就可以根据通行证识别客户了。最常见的方案就是 Cookie。
  3. Cookie 是客户端保存用户信息的一种机制,保存在客户机硬盘上。可以由服务器响应报文Set-Cookie的首部字段信息或者客户端 document.cookie来设置,并随着每次请求发送到服务器。子域名可以获取父级域名 Cookie。
  4. Session 其实是一个抽象概念,用于跟踪会话,识别多次 HTTP 请求来自同一个客户端。Cookie 只是通用性较好的一种实现方案,通常是设置一个名为 SessionID(名称可自定义,便于描述,本文均使用此名称)的 Cookie,每次请求时携带该 Cookie,后台服务即可依赖此 SessionID 值识别客户端。

单系统登录

在介绍单点登录之前,我们先来了解一下在浏览器中,访问一个需要登录的应用时主要发生的一系列流程,如下图所示:

以下为连环画形式,期望能让读者更好的理解:

依赖于登录后设置的 Cookie,之后每次访问时都会携带该 Cookie,从而让后台服务能识别当前登录用户。

题外话

后台是如何通过 SessionID 知道是哪个用户呢?

  1. 数据库存储关联:将 SessionID 与数据信息关联,存储在 Redis、Mysql 等数据库中;
  2. 数据加密直接存储:比如 JWT 方式,用户数据直接从 SessionID 值解密出来(此方式时 Cookie 名称以 Token 居多)。

多系统登录问题

同域名

当访问同域名下的页面时,Cookie 和单系统登录时一样,会正常携带,后台服务即可直接获取到对应的 SessionID 值,后台为单服务还是多服务无差别。

不同子域名

子域名间 Cookie 是不共享的,但各子域名均可获取到父级域名的 Cookie,即 app.demo.comnews.demo.com均可以获取 demo.com域名下的 Cookie。所以可以通过将 Cookie 设置在父级域名上,可以达到子域名共享的效果,即当用户在 app.demo.com 域名下登录时,在demo.com域名下设置名为 SessionID 的 Cookie,当用户之后访问news.demo.com时,后台服务也可以获取到该 SessionID,从而识别用户。

完全不同域名

默认情况下,不同域名是无法直接共享 Cookie 的。

如果只是期望异步请求时获取当前用户的登录态,可以通过发送跨域请求到已经登录过的域名,并配置属性:

xhrFields: {
  withCredentials: true
}

这样可在请求时携带目标域名的 Cookie,目标域名的服务即可识别当前用户。

但是,这要求目标域名的接口支持 CORS 访问(出于安全考虑,CORS 开启 withCredentials 时,浏览器不支持使用通配符*,需明确设置可跨域访问的域名名单)。

题外话

如果只是为了规避浏览器的限制,实现与通配*同样的效果,到达所有域名都可以访问的目的,可根据访问的 Referrer 解析请求来源域名,作为可访问名单。但是出于安全考虑,不推荐使用,请设置明确的可访问域名。

CAS

CAS(Central Authentication Service),即中央认证服务,是 Yale 大学发起的一个开源项目,旨在为 Web 应用系统提供一种可靠的单点登录方法。

既然不能跨域获取,那 CAS 如何做到共享呢?它通过跳转中间域名的方式来实现登录。

页面访问流程如下图:

以下为连环画形式,期望能让读者更好的理解:

其中需要关注以下 2 点:

  1. 所有的登录过程都依赖于 CAS 服务,包含用户登录页面、ST 生成、验证;
  2. 为了保证 ST 的安全性,一般 ST 都是随机生成的,没有规律性。CAS 规定 ST 只能保留一定的时间,之后 CAS 服务会让它失效,而且,CAS 协议规定 ST 只能使用一次,无论 ST 验证是否成功,CAS 服务都会清除服务端缓存中的该 ST,从而规避同一个 ST 被使用两次或被窃取的风险。

扩展阅读

其他相关的内容,也可以进行简单了解,如:单点登录退出 SLO(https://apereo.github.io/cas/5.2.x/installation/Logout-Single-Signout.html)、OAuth2(http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html)。

参考文档

浏览器的同源策略(https://developer.mozilla.org/zh-CN/docs/Web/Security/Same-origin_policy)

CAS 协议(https://apereo.github.io/cas/5.2.x/protocol/CAS-Protocol.html)

本文分享自微信公众号 - 前端食堂(webcanteen)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-05-01

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Node.js异步编程进化论

    我们知道,Node.js中有两种事件处理方式,分别是callback(回调)和EventEmitter(事件发射器)。本文首先介绍的是callback。

    童欧巴
  • HTTP的世界观

    前端圈技术的爆发式增长随之而来的开发人员学不动的疲惫感、焦虑感和不想跳出舒适圈的拖延懒惰。

    童欧巴
  • 从源码解读Vue生命周期,让面试官对你刮目相看

    在我们的实际项目中,与Vue的生命周期打交道可以说是家常便饭。掌握Vue的生命周期对开发者来说是特别重要的。那么如果能够从源码角度理解Vue的生命周期,对我们的...

    童欧巴
  • 图文并茂,为你揭开“单点登录“的神秘面纱

    单点登录( Single Sign On ,简称 SSO),是目前比较流行的企业业务整合的解决方案之一,用于多个应用系统间,用户只需要登录一次就可以访问所有相互...

    政采云前端团队
  • 6种高质量外链的内容类型推荐

    做网站SEO项目的运营人员,为得到高质量的外链往往会费尽心思。而高质量外链往往会依托于优良的内容,项目的类型不同,需要的内容承载也不同。如果内容比较单一,那么指...

    安邦运维ruangseo
  • 6种高质量外链的内容类型推荐

    做网站SEO项目的运营人员,为得到高质量的外链往往会费尽心思。而高质量外链往往会依托于优良的内容,项目的类型不同,需要的内容承载也不同。如果内容比较单一,那么指...

    安邦运维ruangseo
  • corePoolSize vs. maxPoolSize

    Spring中的 ThreadPoolTaskExecutor 是一个 JavaBean ,提供围绕java.util.concurrent.ThreadPoo...

    用户1516716
  • Wolfram Mathematica 实用编程指南在线中文培训

    终于,Wolfram 在线免费中文培训登台了!赶紧注册,您将有机会与Wolfram 技术专家直接交流,现场中文答疑。准备好你的问题,选择你的时间,赶紧注册吧:h...

    WolframChina
  • jmeter 使用总结

    为了方便学习,可以检出 https://github.com/peacetrue/learn-jmeter 资源库,里面有一些具体的测试计划文件(后缀为 jmx...

    安宁
  • 嵌入式,过时了没?

    疑惑一 作者你好,我是本科生,之前是学java的,但是后来签的工作是嵌入式软件开发,我对嵌入式开发不太了解的,这行有前景吗? 这是小编在后台接收到的小伙伴的疑惑...

    程序员互动联盟

扫码关注云+社区

领取腾讯云代金券