首页 > 其他分享 >单点登录(SSO)的设计与实现

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

时间:2023-02-02 16:22:05浏览次数:54  
标签:AuthToken 单点 跨域 登录 登出 SSO com

本文转载自 https://ken.io/note/sso-design-implement

 

一、前言

1、SSO说明

SSO英文全称Single Sign On,单点登录。SSO是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。https://baike.baidu.com/item/SSO/3451380

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

2、设计目标

本篇文章也主要是为了探讨如何设计&实现一个SSO系统

以下为需要实现的核心功能:

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

二、SSO设计与实现

1、核心应用与依赖

单点登录(SSO)设计

应用/模块/对象说明
前台站点 需要登录的站点
SSO站点-登录 提供登录的页面
SSO站点-登出 提供注销登录的入口
SSO服务-登录 提供登录服务
SSO服务-登录状态 提供登录状态校验/登录信息查询的服务
SSO服务-登出 提供用户注销登录的服务
数据库 存储用户账户信息
缓存 存储用户的登录信息,通常使用Redis

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

常见的Web框架对于Session的实现都是生成一个SessionId存储在浏览器Cookie中。然后将Session内容存储在服务器端内存中,这个 ken.io 在之前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系统设计-跨域登出

 

标签:AuthToken,单点,跨域,登录,登出,SSO,com
From: https://www.cnblogs.com/caroline2016/p/17086395.html

相关文章

  • VK1S68C/VK1640B是血氧仪LED数码管显示驱动芯片/LED数显驱动控制电路(IC),SSOP24小体积封
    产品品牌:永嘉微电/VINKA产品型号:VK1S68C封装形式:SSOP24概述:VK1S68C是一种带键盘扫描接口的数码管或点阵LED驱动控制专用芯片,内部集成有3线串行接口、数据锁存器、LED......
  • 登录功能代码实现
    登录功能_代码实现publicclassLoginServletextendsHttpServlet{@OverrideprotectedvoiddoGet(HttpServletRequestrequest,HttpServletResponserespo......
  • 小程序扫码登录网页端原理
    目录一、问题引入二、几个难题1.网页端是怎么知道哪个用户扫描的二维码?2.小程序扫码,扫出来的是什么东西?3.小程序扫到二维码以后,做了什么事情,怎么和网页端通讯的......
  • Python TensorFlow深度学习回归代码:DNNRegressor
      本文介绍基于Python语言中TensorFlow的tf.estimator接口,实现深度学习神经网络回归的具体方法。目录1写在前面2代码分解介绍2.1准备工作2.2参数配置2.3原有模型删......
  • ES的BulkProcessor实现批量写入
    这是读取的文件0,联想(Lenovo)拯救者Y7000P英特尔酷睿i715.6英寸游戏笔记本电脑(8核i7-10875H16G512GRTX2060144Hz)灰,,7299.0,联想京东自营旗舰店,200000,电脑,10000,......
  • 用小程序来实现扫码登录
    小程序扫码登录的优点不需要企业资质,个人用户就可以注册小程序;不需要认证,每年可以省300元;打通小程序端的用户数据,可以让PC网站往移动端引流,用户不流失;流程......
  • SpringBoot框架下shiro与jwt的结合的用户登录
    写了一次使用shiro和jwt的用户登录(没有涉及到用户权限的控制),下面进行很简单的技术总结之前使用的是Redis中保存用户信息,使用uuid-用户信息的键值对来判断用户......
  • S2 - Lesson 28 - No parking
    Wordsrarerarepeoplearatediseaseraresteak Medusa ancient myth Gorgon troublehavetroublewithhavetroubleindoingsth.runintotroubl......
  • 75、缓存---分布式锁---Redisson信号量测试
    可以用来做分布式限流操作。我们在redis中存储一个数据为3@AutowiredRedissonClientredissonClient;@AutowiredStringRedisTemplateredisTemplate......
  • 74、缓存---分布式锁---Redisson闭锁测试
    @AutowiredRedissonClientredissonClient;@AutowiredStringRedisTemplateredisTemplate;//闭锁@GetMapping("/lockDoor")@Response......