单点登录

概念

单点登录 (Single Sign On),简称为 SSO,是指在同一账号平台下的多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。

举个例子,系统A 和 系统B 都属于某公司下的两个不同的应用系统,当用户登录 系统A 后,再打开 系统B ,系统便会自动帮用户登录 系统B ,这种现象就属于单点登录。

image

同域名下

需要有独立的登录系统
image
结合以上流程图我们来分析一波,图中的A和sso都是example.com的子域名,当用户访问A-client时会向A-server发送身份验证请求检验当前请求是否携带有效token,如无效则返回特定 code A-client接到返回后根据 code 做出不同响应。

  • A-server返回 token 有效,则继续保持对A-client的访问。

  • A-server返回 token 无效。

  • A-client重定向至SSO-client并携带redirect参数http://sso.example.com?redirect=a.example.com。

  • 当用户在SSO-client完成登录后(SSO-server 通过 set-cookie 设置 token 为子域名可访问),再通过redirect参数重定向回A-client。

  • 回到A-client后A-client再次向A-server发起身份验证,这次请求会默认携带上domain=example.com的cookie.token,A-server收到token检验有效后,返回用户信息继续保持用户对A-client的有效访问。

至此单点登录的核心逻辑就梳理完成了。

注意:以上是以每套系统都有独立的后端服务(同源)做出的流程,但是有时候我们的后端服可能是同一个,这时候我们在 ABC系统中的请求可能会有跨域/跨站等问题。
解决办法也很多,需要看是跨域,还是跨站问题。
这里贴一个跨域的处理方法 note.youdao.com/s/Tjuuv8Mv 也可以用反向代理去规避跨域问题。

同源:协议+主机名+端口 都相同
同站:二级域名+顶级域名 相同即可

JWT

JWT , Json web token 是基于 Token 的认证授权机制

见名知意,jwt 也是一种 token ,只不过这种 token 有自己的一些约束和规定

一个 JWT 由 头(header),载荷(payload),签名(signature) 组成,具体细节可以查看这篇文章内容:JWT身份认证(附带源码讲解)

此处聊一下关于使用 JWT 的方式来实现单点登录,

简单流程如下

image

对于此处,我们一般会去使用 IDaaS (作为认证中心) 来进行认证,在 IDaaS 中,是可以创建应用的,此处的应用即是我们的关联系统

IDaaS 认证完毕后会将用户信息,具体的签名算法,生成一个 JWT ,给到具体的应用(关联系统) ,关联系统用秘钥解析 JWT 并拿到具体的用户信息之后,再去完成自己平台内部的各种校验,进而让该用户完成认证和授权。
更多的是需要处理 JWT 产生和解析的一个过程,约定好协议字段就可以了,这种方式最简单

也就是说,子系统自己进行token校验,不需要询问认证中心了,减少认证中心压力。是一种分布式认证机制

这种做法无法严格的控制用户下线,需要在每个子系统中处理。所以产生了双token方案。

双token模式

基于jwt模式的弊端——很难对用户进行控制所产生的方案。

image

认证中心会返回两个token,一个过期时间很短,一个过期时间比较长。平时使用短的那个token校验,一旦过期,使用长token询问认证中心,认证中心返回新的短token,重新校验。想控制用户下线只需要在使用长token询问的时候不给他返回短token就行。

posted @ 2023-09-07 21:51  yunChuans  阅读(22)  评论(0编辑  收藏  举报