跳至主要內容

OAuth2分享

chenkun小组分享大约 7 分钟

1、SSO

1.1 SSO介绍

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

1.2 SSO使用场景(解决了什么问题)

很早期的公司,一家公司可能只有一个Server,慢慢的Server开始变多了。每个Server都要进行注册登录,退出的时候又要一个个退出。用户体验很不好!你可以想象一下,上豆瓣 要登录豆瓣FM、豆瓣读书、豆瓣电影豆瓣日记......真的会让人崩溃的。我们想要另一种登录体验:一家企业下的服务只要一次注册,登录的时候只要一次登录,退出的时候只要一次退出。怎么做?

一次注册不难,想一下是不是只要Server之间同步用户信息就行了?可以,但这样描述不太完整,后续讲用户注册的时候详细说。实际上用户信息的管理才是SSO真正的难点,只是作为初学者,我们的难点在于实现SSO的技术!我们先讨论实现手段。

一次登录与一次退出。 回头看看普通商场的故事,什么东西才是保持登录状态关键的东西?记录器(session)?那种叫做cookie的纸张?写在纸张上的ID? 是session里面记录的信息跟那个ID,cookie不只是记录ID的工具而已。客户端持有ID,服务端持有session,两者一起用来保持登录状态。客户端需要用ID来作为凭证,而服务端需要用session来验证ID的有效性(ID可能过期、可能根本就是伪造的找不到对应的信息、ID下对应的客户端还没有进行登录验证等)。但是session这东西一开始是每个server自己独有的,豆瓣FM有自己的session、豆瓣读书有自己的session,而记录ID的cookie又是不能跨域的。所以,我们要实现一次登录一次退出,只需要想办法让各个server的共用一个session的信息,让客户端在各个域名下都能持有这个ID就好了。再进一步讲,只要各个server拿到同一个ID,都能有办法检验出ID的有效性、并且能得到ID对应的用户信息就行了,也就是能检验ID 。

SSO就是解决以上问题,当使用浏览器访问公司任何一个服务时,只要其中一个服务登陆了,那么再打开一个新页面访问另一个服务,是无需再次输入用户名和密码。比如:登陆了OA后,再访问考勤系统是无需登陆。

1.3 使用SSO的好处

  • 方便用户,用户使用应用系统时,能够一次登录,多次使用。用户不再需要每次输入用户名称和用户密码,也不需要牢记多套用户名称和用户密码。单点登录平台能够改善用户使用应用系统的体验。
  • 方便管理员,系统管理员只需要维护一套统一的用户账号,方便、简单。相比之下,系统管理员以前需要管理很多套的用户账号。每一个应用系统就有一套用户账号,不仅给管理上带来不方便,而且,也容易出现管理漏洞。
  • 简化应用系统开发,开发新的应用系统时,可以直接使用单点登录平台的用户认证服务,简化开发流程。单点登录平台通过提供统一的认证平台,实现单点登录。因此,应用系统并不需要开发用户认证程序。

2、SSO常见实现方案

注意

SSO只是一个规范,具体的实现有多种途径,类似Jdbc定义了java数据库连接的规范,具体的实现方案由各数据库厂商自行实现。

单点登录的实现方案一般包含:Cookies、Session 同步、分布式 Session 方式、统一认证授权方式等。目前的大型网站通常采用分布式 Session 及第三方认证授权的方式。

基于 Cookie 的单点登录是最简单的单点登录实现方式,它使用 Cookie 作为媒介,存放用户凭证。 用户登录父应用之后,应用返回一个加密的 Cookie,用户访问子应用的时候,携带上这个 Cookie,授权应用解密 Cookie 并进行校验,校验通过则登录当前用户。 这种方式虽然实现简单,但 Cookie 不够安全,容易泄漏,且不能跨域实现免登。

2.2 分布式 Session 实现单点登录

分布式 Session 实现单点登录原理是将用户认证信息保存于 Session 中,即以 Session 内存储的值为用户凭证,一般采用 Cache 中间件实现(如 Redis)。用户再次登录时,应用服务端获取分布式 Session 来校验用户信息。如图所示: 20221011175808 一般情况下都是基于 Redis 实现 Session 共享,将 Session 存储于 Redis 上,然后将整个系统的全局 Cookie Domain 设置于顶级域名上,这样 SessionID 就能在各个子系统间共享。 这种方式也有一个问题,共享 Session 无法处理跨顶级域名。

2.3 统一认证授权方式实现单点登录

20221011175916

由图可知,通过统一认证授权方式实现单点登录,需要有一个独立的认证系统。

用户第一次访问应用系统时,由于还未登录,被引导到认证系统中进行登录,认证系统接受用户名密码等安全信息,生成访问令牌(ticket)。用户通过 ticket 访问应用系统,应用系统接受到请求之后会访问认证系统检查 ticket 的合法性,如果检查通过,用户就可以在不用再次登录的情况下访问应用系统资源。

以上介绍了单点登录常见的 3 种实现方案,在实际应用中还需要根据具体场景来实现。

接下来通过几个实际生产场景,来阐述单点登录的详细实现方案。

3、实际场景中SSO实现

3.1 JWT(完全跨域方案)

JWT (JSON Web Token)是一个开放标准(RFC7519),它是一个含签名并携带用户相关信息的加密串。页面请求校验登录接口时,请求头中携带 JWT 串到后端服务,后端通过签名加密串匹配校验,保证信息未被篡改,校验通过则认为是可靠的请求,将正常返回数据。

DataSimba(奇点云数据中台产品)结合 JWT 与分布式 session,实现多域多空间单点登录。通过 JWT 生成和校验令牌,将刷新令牌存储在 redis 中,网关统一校验令牌,校验通过后将用户信息设置在请求头中,应用在拦截器中获取到用户信息后即可验证通过。

不同域中的 DataSimba 共用一套密钥并且实时同步用户信息,通过 JWT 生成和校验令牌,用户登录其中一个域后,前端获取 JWT 加密串并存储在 Local Storage 中,当用户切换到其他域时前端传入加密串,后端网关校验,由此实现免登录访问其他域资源,如下图所示: 20221011180112

3.2 使用 OAuth2.0 实现单点登录

OAuth2.0是可以实现SSO的功能,但是OAuth 诞生之初就是为了解决 Web 浏览器场景下的授权问题

4、参考资料

OAuth2.0授权码模式中为什么一定要有codeopen in new window授权码的补充open in new window授权码模式中code的意义open in new window授权码模式是让token在服务器和服务器之间传递,不会经过资源拥有者,资源拥有者无需看到tokenopen in new window