单点登录 (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
- 系统技术选型及架构设计
- 系统端点设计
- 参考资料
表结构
用户表
字段名 | 类型 | 默认值 | 说明 | 索引 |
---|---|---|---|---|
id | string | guid() | 唯一用户标识符 | √ |
nickname | string | 显示名称 | ||
username | string | 用户名 | √ | |
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
未完待续。