✅两个不相关的网站A和B,如何实现A登录B也能自动登录

✅两个不相关的网站A和B,如何实现A登录B也能自动登录

典型回答

这其实是一个非常简单的单点登录的问题,如果你能把这个想清楚,这个问题也就很好回答了。

单点登录(Single Sign-On,简称 SSO)是一种用户认证机制,允许用户在一次登录后,访问多个系统或应用程序而无需再次登录。

一般来说有以下几种方案:

✅Cookie,Session,Token的区别是什么?

上面这篇文章中,我们介绍过Cookie、Session和Token,其实,这三个东西都能帮助我们实现SSO,

1、基于Cookie(不适合本问题,但是先提一下)

单点登录的实现有很多种方式,首先是**如果是同一个域名下 **(如 a.example.comb.example.com) **,可以通过共享Cookie的方式来实现SSO。**优点就是实现起来简单,浏览器天然就支持,而缺点就是限制必须不能跨域。

但是因为本题要求是不相关的两个网站,所以这个方案并不适用。


2、基于Token

使用标准化的令牌(如 JWT)来携带用户认证信息。用户登录后,服务端颁发一个令牌(Token)给到前端,前端在访问其他的网站的时候,把这个Token放到HTTP Header 中带过去,然后就可以基于这个Tokne来验证用户身份了。

这个方案可以解决跨域的问题,只要支持HTTP的协议即可。但是缺点是Token可能会被泄漏。存在一定的安全隐患。

3、基于共享Session(面试的时候重点讲这个)

关于分布式Session(共享Session),我们有多篇文章讲到过,这里就不在重复介绍了

✅怎么实现分布式Session?

✅分布式系统,用户登录信息保存在服务器A上,服务器B如何获取到共享Session

这个方案的好处就是因为Session是服务端存储的,所以不存在泄漏的风险,但是他需要依赖一个公共的第三方存储,如Redis、数据库等。

但是一般来说Session都还是需要一个其他的信息来做关联的,比如Token或者Cookie,所以也并不是说就绝对安全的。只不过可以做二次校验。

4、通过CAS

所谓CAS,这个和我们并发编程中的Compare And Swap的那个不是一回事儿,他是Central Auth Service,也就是认证中心服务。

就是说,多个需要实现单点登录的系统,都接入这个统一的认证中心,所有的登录、 认证都通过这个认证中心来实现。

  • 1、用户访问子系统时重定向到 CAS 服务器登录。
  • 2、CAS 服务器验证用户身份并返回一个票据(Ticket)。
  • 3、子系统使用票据向 CAS 验证,获取用户信息。

这个方案一般适合于企业内部做集成,可以让业务系统不再关心登录、授权,而是只关注业务逻辑,只需要做一次接入就行了。比如说你们公司的很多内部平台之间,就可能是用了同一个登录服务。

优点就是接入成本低,缺点就是这个认证中心本身的开发成本还是挺高的。

5、通过OAuth2/ OpenID Connect

基于 OAuth 2.0 协议,允许用户通过授权服务器进行身份验证,子系统通过访问令牌或用户信息完成验证。

✅什么是OAuth2?有什么用?

这个方案和CAS类似,只不过CAS是把OAuth2做到自己的内部了。简化了接入成本。