设计一个 SSO 单点登录系统

news2024/9/23 19:21:35

单点登录 (SSO) 发生在用户登录到一个应用程序,然后自动登录到其他应用程序时,无论用户使用的平台、技术或域如何。用户仅登录一次,因此功能的名称(单一登录)。

例如,如果您登录 Gmail 等 Google 服务,您将自动通过 YouTube、AdSense、Google Analytics 和其他 Google 应用的身份验证。同样,如果您退出Gmail或其他Google应用程序,则会自动退出所有应用程序;这称为单点注销。

SSO 可在用户使用应用程序和服务时提供无缝体验。用户不必记住每个应用程序或服务的单独凭据集,只需登录一次即可访问您的全套应用程序。

每当用户转到需要身份验证的域时,他们都会被重定向到身份验证域,可能会要求他们登录。如果用户已在身份验证域中登录,则可以立即将其重定向到原始域,而无需再次登录。

工作原理

单点登录和单点注销可以通过使用会话来实现。对于具有 SSO 的用户,最多可以有三个不同的会话:

  • 应用程序维护的本地会话
  • 授权服务器会话(如果已启用 SSO)
  • 身份提供程序 (IdP) 会话(如果用户选择通过身份提供程序(例如 Google、Facebook 或企业 SAML 身份提供程序)登录

使用 SSO,中央域执行身份验证,然后与其他域共享会话。SSO 协议之间的会话共享方式可能不同,但一般概念是相同的。

例如,身份验证域可能会生成签名的 JSON Web 令牌 (JWT)(使用 JSON Web 加密 (JWE) 加密),其中包含标识需要身份验证的任何其他域的用户所需的所有信息。此令牌将传递给客户端,但由于它是签名的,因此客户端无法以任何方式对其进行修改。令牌可以通过重定向传递到原始域,并由身份验证域和任何其他域用于标识用户。

在这里插入图片描述

文章目录

  • 工作原理
  • 表结构
    • 用户表
    • 第三方登录信息绑定表
    • 应用表
  • 缓存结构
    • 验证邮箱
    • JWT Token
  • 系统技术选型及架构设计
  • 系统端点设计
  • 参考资料

表结构

用户表

字段名类型默认值说明索引
idstringguid()唯一用户标识符
nicknamestring显示名称
usernamestring用户名
emailstring邮箱
mobilestring手机号
avatarstring头像
passwordstring密码
saltstring密码加盐密钥
typestring用户状态,如 vip、黑名单用户,enum 字符串
created_atdatenow()注册日期
updated_atdatenow()更新日期

第三方登录信息绑定表

字段名类型默认值说明索引
user_idstring用户表外键
providerstring第三方提供商,enum 字符串
third_idstring第三方用户 id
rawjson第三方用户信息完整数据
created_atdatenow()注册日期
updated_atdatenow()更新日期

在以上基础功能实现后,可以记录登录日志、最后访问 ip 等信息。

应用表

字段名类型默认值说明索引
idstringguid()唯一应用标识符
namestring应用名称
descriptionstring应用描述信息
secretstring密钥
jwksjson为 id_token 签名的 jwk
redirect_urisjson回调连接,string[]
logostring应用 Logo 图标
homepagestring应用主页(默认回调页面)
created_atdatenow()注册日期
updated_atdatenow()更新日期

说明: guid 为 16 进制 20 位随机字符串。

缓存结构

验证邮箱

email:${code}

内容为 user_id,有效期为 1 小时(暂定)。

验证手机号,修改邮箱验证码类似。基础功能实现后再进行考虑。

JWT Token

token:${token}

内容为用户信息 JSON、Refresh Token 等,有效期为 30 天(暂定)。

系统技术选型及架构设计

  • 全栈前后端框架: Remix
  • 部署 Edge Functions: Cloudflare Pages/Workers
  • 数据库: Cloudflare D1 (SQLite)
  • 缓存: Cloudflare KV (或者 Durable Object)
  • UI: Tailwind CSS + Daisy UI

可以采用 Monorepo 将数据库、缓存的 Provider 做成可拆卸的,方便替换为其他数据库或缓存。同时,可以用 Hono 或者 Nitro 框架来更换部署的场景。

系统端点设计

  • /.well-known/openid-configuration - OIDC 配置发现
  • /.well-known/jwks.json - 公钥
  • /authorize - OIDC 鉴权
  • /token
  • /userinfo
  • /auth/${provider}/callback - 第三方登录回调
  • /revoke - 手动撤回 Token

参考资料

  • Open ID Connect网站 http://openid.net/connect/
  • JSON Web Tokens(OIDC各类编程语言的类库) https://jwt.io/
  • [认证授权] 4.OIDC(OpenId Connect)身份认证授权(核心部分) http://www.cnblogs.com/linianhui/p/openid-connect-core.html

未完待续。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1079751.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

双周赛114(模拟、枚举 + 哈希、DFS)

文章目录 双周赛114[2869. 收集元素的最少操作次数](https://leetcode.cn/problems/minimum-operations-to-collect-elements/)模拟 [2870. 使数组为空的最少操作次数](https://leetcode.cn/problems/minimum-number-of-operations-to-make-array-empty/)哈希 枚举 [2871. 将数…

【Redis】之高并发场景下主从同步数据一致性问题探究

高并发极限场景 问题分布式锁失效,高并发极限场景下主从同步延时主节点崩溃等原因导致的数据不一致 背景知识:redis主从复制为异步同步过程 如图:redis cluster集群部署,多主多从架构(基于哈希槽的分配策略&#xf…

Flink报错could not be loaded due to a linkage failure

文章目录 1、报错2、原因3、解决 1、报错 在Flink上提交作业,点Submit没反应,F12看到接口报错信息为: 大概意思是,由于链接失败,无法加载程序的入口点类xx。没啥鸟用的信息,去日志目录继续分析&#xff1a…

1712A 300A嵌入式电源系统

1712A 300A嵌入式电源系统 1712A 300A嵌入式电源系统采用模块化设计、组合式结构,由控制器、整流模块、交流配电单元、直流配电单元等组成。该系统将交流电转换成稳定的-48V直流电,用于铁塔、移动、电信、联通等公司的传输、接入网,以及专网等…

这样的丝瓜竟比砒霜还毒?赶紧看......

丝瓜滑嫩爽口,富含多种营养物质,无论凉拌还是炒菜都是不错的选择。可最近有人说,苦味的丝瓜有毒,甚至比砒霜还毒! 这是真的吗? 苦味丝瓜,毒过砒霜? 苦味丝瓜中毒是因为碱糖甙生物碱…

NVIDIA CX 网卡驱动安装 测试

确定系统版本 cat /etc/issue Ubuntu 20.04.4 LTS \n \l uname -m x86_64 下载驱动 https://network.nvidia.com/products/infiniband-drivers/linux/mlnx_ofed/ 选择对应系统版本架构 上传文件后解压文件 tar xf MLNX_OFED_LINUX-23.07-0.5.1.2-ubuntu20.04-x86_64.tgz 进…

【Spring框架学习3】Spring Bean的作用域 及 生命周期

一、Spring Bean的作用域有哪些? Spring框架支持以下五种Bean的作用域: Singleton:这是默认的作用域,在每个Spring IoC容器中只有一个Bean的实例(IoC初始化后)。Spring 中的 bean 默认都是单例的,是对单例设计模式的…

捕捉回忆的时光机:用AI智能管理的NAS,提升整理效率

记忆会模糊,但照片不会,每次打开照片的时候背后的故事就会浮现在我们眼前。当然,我们现在的设备也越来越多了,当我们要找某一张照片时总是需要从散落在各个设备里的照片库寻找,花费大量时间。而Terra Photos的出现&…

剑指offer——JZ37 序列化二叉树 解题思路与具体代码【C++】

一、题目描述与要求 序列化二叉树_牛客题霸_牛客网 (nowcoder.com) 题目描述 请实现两个函数,分别用来序列化和反序列化二叉树,不对序列化之后的字符串进行约束,但要求能够根据序列化之后的字符串重新构造出一棵与原二叉树相同的树。 二叉…

apple pencil有没有必要买?口碑好的电容笔推荐

相信很多小伙伴都在纠结,该选哪一支电容笔呢?一款原装的Apple Pencil,售价接近1000元,这个价位,在许多人的眼中,已经是相当的高了。其实,平替电容笔的价格很低,一两百块钱就能买到&a…

C/C++: * 和 *的区别

/** * * Althor:Hacker Hao * Create:2023.10.11 * */#include <bits/stdc.h> using namespace std; void fun1(int* ptr) {*ptr 3;ptr NULL; //不会改变原指针所指向的对象 }void fun2(int*& ptr) {*ptr 2;ptr NULL; //会改变原指针所指向的对象//也就…

2023年9月国产数据库大事记-墨天轮

本文为墨天轮社区整理的2023年9月国产数据库大事件和重要产品发布消息。 目录 9月国产数据库大事记 TOP109月国产数据库大事记&#xff08;时间线&#xff09;产品/版本发布兼容认证代表厂商大事记排行榜新增数据库厂商活动相关资料 9月国产数据库大事记 TOP10 9月国产数据库…

第十一章 共用体union和枚举enum

共用体 概念 有时想用同一段内存单元存放不同类型的变量。例如&#xff0c;把一个短整型变量&#xff0c;一个字符型变量和一个实型变量放在同一个地址开始的内存单元中 1000地址。以上3个变量在内存中占的字节数不同&#xff0c;但都从同一地址开始(图中设地址为1000)存放&a…

推荐高效的电脑磁盘备份解决方案!

该怎样实现电脑磁盘备份&#xff1f; 接下来&#xff0c;我们将为你介绍两种磁盘备份方法。一种是利用操作系统自带的功能&#xff0c;另一种则是通过第三方工具实现。 方法一. Windows自带的备份还原功能 要在Windows 11/10/8/7中备份软件&#xff0c;你可以使…

Linux shell编程学习笔记10:expr命令 和 算术运算

Linux Shell 脚本编程和其他编程语言一样&#xff0c;支持算数、关系、布尔、字符串、文件测试等多种运算。上节我们研究了 Linux shell编程 中的 字符串运算&#xff0c;今天我们研究 Linux shell编程的算术运算 &#xff0c;为了方便举例&#xff0c;我们同时对expr命令进行…

物联网AI MicroPython传感器学习 之 Relay继电器模块

学物联网&#xff0c;来万物简单IoT物联网&#xff01;&#xff01; 一、产品简介 继电器&#xff08;英文名称&#xff1a;relay&#xff09;是一种电控制器件&#xff0c;是当输入量的变化达到规定要求时&#xff0c;在电气输出电路中使被控量发生预定的阶跃变化的一种电器。…

linux查看文件内容命令more/less/cat/head/tail/grep

1.浏览全部内容more/less 文件&#xff1a; more&#xff1a;可以查看文件第一屏的内容&#xff0c;同时左下角有一个显示内容占全部文件内容的百分比&#xff0c;空格键会显示下一屏的内容&#xff0c;直到文件末尾 [rootmaster data]# more file1less&#xff1a;相较于mor…

前端工程化(editorconfig+ESLint+Prettier+StyleLint+Husky、Commitlint)

前言 致谢&#xff1a;有来技术大大 通过学习有来技术大大的文章和结合自己的实践&#xff0c;写一篇笔记记录一下 所使用的工具&#xff1a; ide项目风格(editorconfig)代码检查(ESLint)代码风格(Prettier)样式风格(StyleLint)git提交规范(Husky、Commitlint) 一、ide项目…

【算法设计与分析】— —单源最短路径的贪心算法

&#x1f383;欢迎大家前去观看我的算法设计与分析专栏&#xff1a; 算法设计与分析_IT闫的博客-CSDN博客 希望对大家有所帮助&#xff01; &#x1f383;个人专栏&#xff1a; &#x1f42c; 算法设计与分析&#xff1a;算法设计与分析_IT闫的博客-CSDN博客 &#x1f433;Java…

玉柴集团用USB Server对U盾远程安全管控

在当今数字化时代&#xff0c;企业的业务规模和组织结构日益复杂&#xff0c;对于U盾这样小小的&#xff0c;但却异常重要的USB设备的管理和使用提出了更高的要求。广西玉柴机器股份有限公司作为一家综合性集团企业&#xff0c;其业务规模庞大&#xff0c;组织结构复杂&#xf…