1. 什么是单点登录
比如有一家公司,他业务线很多,有小游戏,有商城,有小程序,导致有很多系统,他不可能为每一个系统做一套用户管理,因为这些系统都是属于公司的,用户是相通的,他就会把用户系统抽离出来,形成一个认证中心。用户要登录,注册,修改用户信息都到这个认证中心来,专门来管理用户的。用户对自身的所有操作都在一个点,这就叫单点。这些用户需要做的登录,就是单点登录。
2. 怎么实现单点登录
实现单点登录的模式有 Session + Cookie、TOKEN、TOEKN + RFRESHTOKEN 这三种。
2.1 Session + Cookie 模式
实现步骤:1. 用户到认证中心登录,认证中心有一个 Session 表,记录键值对,键是 sid,值是用户信息。登录成功往这个表记录一条键值对。只要 Session 表格有这个记录,证明登录成功。2. 把 sid 用 Cookie 给用户返回。用户访问子系统时把 sid 带给子系统。3. 子系统根据 sid 判断有没有登录,但是子系统判断不了,他没有 Session 表格,就需要发给认证中心,让认证中心判断。4. 认证中心去 Session 表查 sid,查到了,就是登录,没查到,就是没登陆,或者登录过期的。这就是 Session + Cookie 模式。
优点:认证中心有很强的控制力,比如用户有违规操作,我们要让他下线,直接从 Session 表格里把他删了,子系统再拿 sid 来查,就是查不到的,就需要通知用户重新登录,如果在加上黑名单控制,直接用户就是登录不了了。很多大厂要保证对用户的绝对控制,就是这种模式。
缺点:但是这种模式有个缺点,就是烧钱。用户量大的应用,同时在线几千万人,上亿人,认证中心的压力就很大,各种子系统发给他认证,表格也会变得非常大,还要做 Session 集群。认证中心挂了,所有系统都要完蛋,还得做容灾。
2.2 Token 模式
实现步骤:1. 用户去认证中心登录,登录成功后,不再向 Session 表插入键值对,生成一个不能被篡改的字符串作为 token 发给用户,token 格式一般是 JWT。2. token 发给用户后,用户就存起来,接下来后,认证中心就不管了,用户访问子系统就携带这个 token,子系统自行认证 token。
优点:便宜,认证中心压力小。
缺点:失去了对用户的控制。比如有一天,你希望一个用户下线,咋办,你最多只能让他不能再登录了,但是你之前发给他的 token 还是有效的,仍然是可以向子系统发送请求的。这时你必须去通知子系统,不能让他访问了,一个子系统还好,如果有很多,就会很麻烦。
2.3 Token + RfreshToken 双 token 模式
实现步骤:1. 用户在认证中心登录,登录成功后,认证中心给他两个 token,一个是所有子系统都可以自行认证的 token,另一个是只有认证中心才认识的 token,叫刷新 token,两个 token 都存起来。但是第一个 token 过期时间非常非常短,比如 10 分钟,而第二个 token 过期时间就长一点,一个月。2. 用户在请求子系统时,带第一个 token,去认证,有效就可以用。3. 如果 token 失效了,我们还有一个刷新 token,带着刷新 token 去访问认证中心,然后认证中心再给你一个 token,再用这个新 token 去请求子系统。
这个模式的意义:要让用户每隔一小段时间来一次,这个作用是方便我们控制,比如我们要让一个用户下线,虽然我们没办法让他立即下线,但是过一会他要来请求新 token,我们不给了,那他的 token 就是失效的,就访问不了子系统了。
优点:便宜,还能对用户有较强的控制力。