1.登录功能

登录功能通常都是基于 Cookie 来实现的。当用户登录成功后,一般会将登录状态记录到 Session 中,或者是给用户签发一个 Token,然后浏览器将Session 的 ID 或 Token 保存到 Cookie 中,浏览器在之后的每次请求中携带它们。当服务端收到请求后,通过验证 Cookie 中的信息来判断用户是否登录 。

2.单点登录(Single Sign On, SSO)

单点登录指的是:用户只需登录一次,就可访问同一帐号平台下的多个应用系统。

单点登录的本质就是在多个应用系统中共享登录状态。如果用户的登录状态是记录在 Session 中的,要实现共享登录状态,就要先共享 Session,比如可以将 Session 存到 同一个Redis 中,用户访问时,都可以读取 同一个Redis Session来获取登录状态。

但由于不同的应用系统有着不同的域名,尽管 Session 共享了,但是由于 Session ID 是往往保存在浏览器 Cookie 中的,因此无法跨域名传递,也就是说当用户在 app1.com 中登录后,Session ID 仅在浏览器访问 app1.com 时才会自动在请求头中携带,而当浏览器访问 app2.com 时,Session ID 是不会被带过去的。所以实现单点登录的关键就是,如何让 Session ID(或 Token)在多个域中共享。

实现sessionid或者token多域共享主要有三种方式,父域cookie、认证中心、localstorage

3.实现方式

(1)父域cookie

Session ID(或 Token)保存到父域中。也就是将 Cookie 的 domain 属性设置为主域名,同时将 path 属性设置为根路径,这样所有的子域应用就都可以访问到这个 Cookie 了。

缺点:不支持跨主域名

(2)认证中心

可以部署一个认证中心,用来专门负责处理登录请求。

检查token:用户访问某个应用系统,应用系统检查当前请求有没有 Token,如果没有,说明用户在当前系统未登录,跳转至认证中心。认证中心根据 Cookie (认证中心的)判断用户是否在其他应用系统已登录。

返回url:如果发现用户尚未登录,则返回登录页面,等待用户登录,如果发现用户已登录,会跳转回目标 URL ,让token拼接在目标 URL 的后面,回传给目标应用系统。

验证token:应用系统拿到 Token 之后,还需要向认证中心验证Token ,防止用户伪造。确认无误后,应用系统记录用户的登录状态,并将 Token 写入 Cookie,然后给本次访问放行。(注意这个 Cookie 是当前应用系统的,其他应用系统是访问不到的。)当用户再次访问当前应用系统时,就会自动带上这个 Token,应用系统验证 Token 发现用户已登录,直接返回正常的响应。

(3)localstorage

将 Session ID (或 Token )保存到浏览器的 LocalStorage 中,前端通过 iframe+postMessage() 方式,将同一份 Token 写入到了多个域下的 LocalStorage 中,前端每次在向后端发送请求之前,都会主动从 LocalStorage 中读取 Token 并在请求中携带,这样就实现了同一份 Token 被多个域所共享。

此种实现方式完全由前端控制,同样支持跨域。后端需要做的仅仅是在用户登录成功后,将 Session ID (或 Token )放在响应体中传递给前端。

 推荐阅读:

学习Web前端 自学宝典

【uni-app】uniapp项目优化方式及建议

前端跨域设置 withCredentials: true

Logo

Authing 是一款以开发者为中心的全场景身份云产品,集成了所有主流身份认证协议,为企业和开发者提供完善安全的用户认证和访问管理服务

更多推荐