设计一个 SSO 单点登录系统

单点登录 (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) 加密),其中包含标识需要身份验证的任何其他域的用户所需的所有信息。此令牌将传递给客户端,但由于它是签名的,因此客户端无法以任何方式对其进行修改。令牌可以通过重定向传递到原始域,并由身份验证域和任何其他域用于标识用户。

设计一个 SSO 单点登录系统_第1张图片

文章目录

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

表结构

用户表

字段名 类型 默认值 说明 索引
id string guid() 唯一用户标识符
nickname string 显示名称
username string 用户名
email string 邮箱
mobile string 手机号
avatar string 头像
password string 密码
salt string 密码加盐密钥
type string 用户状态,如 vip、黑名单用户,enum 字符串
created_at date now() 注册日期
updated_at date now() 更新日期

第三方登录信息绑定表

字段名 类型 默认值 说明 索引
user_id string 用户表外键
provider string 第三方提供商,enum 字符串
third_id string 第三方用户 id
raw json 第三方用户信息完整数据
created_at date now() 注册日期
updated_at date now() 更新日期

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

应用表

字段名 类型 默认值 说明 索引
id string guid() 唯一应用标识符
name string 应用名称
description string 应用描述信息
secret string 密钥
jwks json 为 id_token 签名的 jwk
redirect_uris json 回调连接,string[]
logo string 应用 Logo 图标
homepage string 应用主页(默认回调页面)
created_at date now() 注册日期
updated_at date now() 更新日期

说明: 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

未完待续。

你可能感兴趣的:(javascript,前端,开发语言,人工智能,github)