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

    在这里插入图片描述

    表结构

    用户表

    字段名类型默认值说明索引
    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}
    
    • 1

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

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

    JWT Token

    token:${token}
    
    • 1

    内容为用户信息 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

    参考资料


    未完待续。

  • 相关阅读:
    一起Talk Android吧(第四百一十二回:Math类常用方法介绍)
    js常用方法JQ选择器
    33.2.4 配置Mycat负载均衡
    Kafka入门知识点
    androidx.appcompat.widget.Toolbar最右边设置控件不能仅靠最右边
    Servlet原理及应用
    【c#表达式树】最完善的表达式树Expression.Dynamic的玩法
    Linux ARM平台开发系列讲解(GMSL摄像头篇)1.1 GMSL协议介绍
    枚举类型enum用法笔记
    deepTools对ChIP-seq数据可视化
  • 原文地址:https://blog.csdn.net/jslygwx/article/details/133765190