浅谈单点登录 SSO 实现方案 | StartDT Tech Lab 06
这是奇点云全新技术专栏「StartDT Tech Lab」的第 6 期。
在这里,我们聚焦数据技术,分享方法论与实战。一线的项目经历,丰富的实践经验,真实的总结体会…滑到文末,可以看到我们的往期内容。
本篇由奇点云数据平台后端架构师「褚岩」带来:
作者:褚岩
阅读时间:约 7 分钟
#1 什么是单点登录(SSO)
单点登录(Single Sign On,简称 SSO),是指在多系统应用群中登录一个系统,便可在其他所有系统中得到授权,无需再次登录。
这种技术目前得到了广泛使用,它核心解决了一个问题:用户只需要登录一次,就可以访问所有相互信任的应用系统。
#2 单点登录的原理及实现方案
单点登录的实现方案一般包含:Cookies、Session 同步、分布式 Session 方式、统一认证授权方式等。目前的大型网站通常采用分布式 Session 及第三方认证授权的方式。
2.1
基于 Cookie 的单点登录
基于 Cookie 的单点登录是最简单的单点登录实现方式,它使用 Cookie 作为媒介,存放用户凭证。
用户登录父应用之后,应用返回一个加密的 Cookie,用户访问子应用的时候,携带上这个 Cookie,授权应用解密 Cookie 并进行校验,校验通过则登录当前用户。
这种方式虽然实现简单,但 Cookie 不够安全,容易泄漏,且不能跨域实现免登。
2.2
分布式 Session 实现单点登录
分布式 Session 实现单点登录原理是将用户认证信息保存于 Session 中,即以 Session 内存储的值为用户凭证,一般采用 Cache 中间件实现(如 Redis)。用户再次登录时,应用服务端获取分布式 Session 来校验用户信息。如图所示:
图源:CSDN(作者:路远)
一般情况下都是基于 Redis 实现 Session 共享,将 Session 存储于 Redis 上,然后将整个系统的全局 Cookie Domain 设置于顶级域名上,这样 SessionID 就能在各个子系统间共享。
这种方式也有一个问题,共享 Session 无法处理跨顶级域名。
2.3
统一认证授权方式实现单点登录
图源:褚岩
由图可知,通过统一认证授权方式实现单点登录,需要有一个独立的认证系统。
用户第一次访问应用系统时,由于还未登录,被引导到认证系统中进行登录,认证系统接受用户名密码等安全信息,生成访问令牌(ticket)。用户通过 ticket 访问应用系统,应用系统接受到请求之后会访问认证系统检查 ticket 的合法性,如果检查通过,用户就可以在不用再次登录的情况下访问应用系统资源。
以上介绍了单点登录常见的 3 种实现方案,在实际应用中还需要根据具体场景来实现。
接下来通过几个实际生产场景,来阐述单点登录的详细实现方案。
#3 使用 JWT 实现单点登录
(完全跨域方案)
JWT (JSON Web Token)是一个开放标准(RFC7519),它是一个含签名并携带用户相关信息的加密串。页面请求校验登录接口时,请求头中携带 JWT 串到后端服务,后端通过签名加密串匹配校验,保证信息未被篡改,校验通过则认为是可靠的请求,将正常返回数据。
DataSimba(奇点云数据中台产品)结合 JWT 与分布式 session,实现多域多空间单点登录。通过 JWT 生成和校验令牌,将刷新令牌存储在 redis 中,网关统一校验令牌,校验通过后将用户信息设置在请求头中,应用在拦截器中获取到用户信息后即可验证通过。
不同域中的 DataSimba 共用一套密钥并且实时同步用户信息,通过 JWT 生成和校验令牌,用户登录其中一个域后,前端获取 JWT 加密串并存储在 Local Storage 中,当用户切换到其他域时前端传入加密串,后端网关校验,由此实现免登录访问其他域资源,如下图所示:
DataSimba 单点登录时序图
#4 使用 OAuth2.0 实现单点登录
OAuth 2.0 是一种认证授权机制,主要用来颁发令牌(token),OAuth 的核心就是向第三方应用颁发令牌,OAuth2.0 就是对应上文 2.3(统一认证授权方式实现单点登录)中的认证系统。
OAuth 在“客户端”与“服务端”之间,设置了一个授权层(Authorization Layer), “客户端”通过登录授权层获取令牌,通过令牌即可访问服务端资源。
OAuth2.0 单点登录流程同上文介绍的“统一认证授权方式”流程一致:用户首次访问服务端资源时未登录,被引导到认证系统中进行登录授权,登录成功后获取令牌,用户获取令牌后可以通过令牌获取用户信息。客户端必须获取到用户授权,才能获取令牌。
OAuth2.0 定义了 4 种授权方式:
DataSimba 通过简化模式获取令牌,使用 OAuth2.0 实现单点登录时序图如下:
图源:褚岩
通过 OAuth2.0 认证实现单点登录,为开发人员提供了一个通用的身份验证框架,提高开发人员的效率,解决了跨顶级域名单点登录问题。
#5 集成 LDAP 实现统一认证登录
LDAP(Lightweight Directory Access Protocol),它是基于 X.500 标准的轻量级目录访问协议。LDAP 目录服务是由目录数据库和一套访问协议组成的系统。
日常办公经常会有多套系统,如果各个系统各自维护一套用户认证,用户需要记住多个用户名密码。系统各自管理用户认证的方式,不但会有重复建设的问题,用户体验也会差——经常会有用户忘记密码的情况。通过 LDAP,我们可以管理企业级账号,认证用户名密码,实现统一账号登录,只需一个用户名密码就可以登录所有系统。
LDAP 作为统一登录认证架构图如下:
图源:褚岩
LDAP 主要是用来实现统一身份认证的技术,目前市面上大部分的开源系统都支持 LDAP,因此通过 LDAP 能够统一管理和维护公司的账号,极大地提高了运维的工作效率。
在实际应用中,奇点云的数据中台产品 DataSimba 也通过单点登录实现了多域多空间的访问。用户登录 DataSimba 某一个域后,无需再次登录,即可方便地切换到其他域。
以一个国内大型饮料集团客户为例,DataSimba 使用 JWT+Session 共享方式实现跨域单点登录,通过 OAuth2.0 对接其统一认证平台,实现统一账号单点登录。
实现单点登录的技术方案很多,但没有哪种方案可以完美解决所有问题。我们需要针对具体应用场景来制定最优解决方案。
评论