本文已经收录到Github仓库,该仓库包括计算机根底、Java根底、多线程、JVM、常见结构、分布式、微服务、规划模式、架构等中心知识点,欢迎star~

地址:github.com/Tyson0314/J…

一、前语

1、SSO阐明

SSO英文全称Single Sign On,单点登录。SSO是在多个运用体系中,用户只需求登录一次就能够拜访一切相互信任的运用体系。baike.baidu.com/item/SSO/34…

例如拜访在网易账号中心(reg.163.com/ )登录之后 拜访以下站点都是登录状况

  • 网易直播 v.163.com
  • 网易博客 blog.163.com
  • 网易花田 love.163.com
  • 网易考拉 www.kaola.com
  • 网易Lofter www.lofter.com

2、规划目标

本篇文章也主要是为了讨论怎么规划&完结一个SSO体系

以下为需求完结的中心功能:

  • 单点登录
  • 单点登出
  • 支撑跨域单点登录
  • 支撑跨域单点登出

二、SSO规划与完结

1、中心运用与依赖

单点登录(SSO)的设计与实现

运用/模块/对象 阐明
前台站点 需求登录的站点
SSO站点-登录 供给登录的页面
SSO站点-登出 供给刊出登录的入口
SSO服务-登录 供给登录服务
SSO服务-登录状况 供给登录状况校验/登录信息查询的服务
SSO服务-登出 供给用户刊出登录的服务
数据库 存储用户账户信息
缓存 存储用户的登录信息,一般运用Redis

2、用户登录状况的存储与校验

常见的Web结构关于Session的完结都是生成一个SessionId存储在浏览器Cookie中。然后将Session内容存储在服务器端内存中。

用户登录成功之后,生成AuthToken交给客户端保存。如果是浏览器,就保存在Cookie中。如果是手机App就保存在App本地缓存中。本篇主要讨论根据Web站点的SSO。

用户在浏览需求登录的页面时,客户端将AuthToken提交给SSO服务校验登录状况/获取用户登录信息

关于登录信息的存储,主张选用Redis,运用Redis集群来存储登录信息,既能够保证高可用,又能够线性扩大。同时也能够让SSO服务满足负载均衡/可弹性的需求。

对象 阐明
AuthToken 直接运用UUID/GUID即可,如果有验证AuthToken合法性需求,能够将UserName+时刻戳加密生成,服务端解密之后验证合法性
登录信息 一般是将UserId,UserName缓存起来

3、用户登录/登录校验

  • 登录时序图

单点登录(SSO)的设计与实现

依照上图,用户登录后Authtoken保存在Cookie中。 domian= test. com 浏览器会将domain设置成 .test.com, 这样拜访一切*.test.com的web站点,都会将Authtoken携带到服务器端。 然后经过SSO服务,完结对用户状况的校验/用户登录信息的获取

  • 登录信息获取/登录状况校验

单点登录(SSO)的设计与实现

4、用户登出

用户登出时要做的工作很简单:

  1. 服务端铲除缓存(Redis)中的登录状况
  2. 客户端铲除存储的AuthToken
  • 登出时序图

单点登录(SSO)的设计与实现

5、跨域登录、登出

前面提到过,中心思路是客户端存储AuthToken,服务器端经过Redis存储登录信息。因为客户端是将AuthToken存储在Cookie中的。所以跨域要解决的问题,便是怎么解决Cookie的跨域读写问题。

解决跨域的中心思路便是:

  • 登录完结之后经过回调的方式,将AuthToken传递给主域名之外的站点,该站点自即将AuthToken保存在当时域下的Cookie中。
  • 登出完结之后经过回调的方式,调用非主域名站点的登出页面,完结设置Cookie中的AuthToken过期的操作。
  • 跨域登录(主域名已登录)

单点登录(SSO)的设计与实现

  • 跨域登录(主域名未登录)

单点登录(SSO)的设计与实现

  • 跨域登出

单点登录(SSO)的设计与实现

三、补白

  • 关于方案

这次规划方案更多是供给完结思路。如果涉及到APP用户登录等状况,在拜访SSO服务时,增加对APP的签名验证就好了。当然,如果有无线网关,验证签名不是问题。

本文授权转载自Ken,原文链接:ken.io/note/sso-de…