详细了解如何设计和实现一个SSO系统?

一、SSO系统有什么好处?

1、用户角度:一次登录多次使用,无需记录多套用户名和密码,省事省心。

2、系统管理员角度:管理员只需要维护好一个统一的账号中心就可以了,方便

3、新系统开发角度:新系统开发时只需直接对接统一的账号中心即可,简化开发流程,省时

二、SSO设计与实现?

本篇主要探讨基于Web站点的SSO ,核心包括:单点登录和登出、支持跨域单点登录和登出

核心应用和依赖

三、用户登录状态的存储跟校验?

 常见的Web框架对于Session的实现都是生成一个SessionId存储在浏览器Cookie中,然后将Session内容存储在服务器内存中,用户登录成功之后,生成AuthToken交给客户端保存,如果是浏览器,就保存在Cookie中,如果是手机APP就保存在APP本地缓存中。用户在浏览需要登录的页面时,客户端将AuthToken提交给SSO服务校验登录状态/获取用户登录信息,对于登录信息的存储,建议采用Redis,使用Redis集群来存储登录信息,既可以保证高可用,又可以线性扩充,同时也可以让SSO服务满足负载均衡/可伸缩的需求。

用户登录/校验时序图如下

按照上图,用户登录后AuthToken保存在Cookie中,浏览器会将domain设置成 .test.com,这样访问所有*.test.com的web站点,都会将AuthToken携带到服务器端,然后通过SSO服务,完成对用户状态的校验/用户登录信息的获取。

登录信息获取/登录状态校验

 用户登出:

1、服务端清除缓存(redis)中的登录状态

2、客户端清除存储的AuthToken

登出时序图

跨域登录/登出

前面提到过,核心思路是客户端存储 AuthToken,服务器端通过 Redis 存储登录信息。由于客户端是将 AuthToken 存储在 Cookie 中的。所以跨域要解决的问题,就是如何解决 Cookie 的跨域读写问题。所以解决跨域的核心思路就是:

  • 登录完成之后通过回调的方式,将 AuthToken 传递给主域名之外的站点,该站点自行将 AuthToken 保存在当前域下的 Cookie 中。
  • 登出完成之后通过回调的方式,调用非主域名站点的登出页面,完成设置 Cookie 中的 AuthToken 过期的操作。

 我们下一章具体看跨域登出问题,包括主域名登录和主域名未登录两种情况。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值