Authelia 集成 Memos:配置 OpenID Connect 1.0 实现 Web 应用单点登录
【免费下载链接】autheliaThe Single Sign-On Multi-Factor portal for web apps. OpenID Certified™ and Post-Quantum Cryptography Ready.项目地址: https://gitcode.com/GitHub_Trending/au/authelia
本篇技术指南以 Authelia 仓库中的 Memos 集成文档 为骨架,讲解如何将 Memos(开源备忘录/笔记应用)接入 Authelia 的 OpenID Connect 1.0 Provider,实现由 Authelia 统一托管的单点登录(SSO)。读完本文,你将掌握 Authelia 侧 OIDC 客户端的完整 YAML 配置、Memos 侧 Web GUI 的 SSO 参数填写方法,以及该集成背后涉及到的端点调用链与安全注意事项,可直接复制到自己的生产环境中落地。
测试版本与适用前提
官方文档针对以下版本组合完成了联调验证,这是该集成指南的事实基准:
- Authelia:v4.38.0
- Memos:v0.16.1
需要说明的是,Memos 通过其设置界面的SSO模块以OAuth2 客户端的身份接入 Authelia,属于 OpenID Connect 1.0 集成参考 体系下的一个 Relying Party 实现案例。该文档标注的支持级别为 community(社区维护)、integration: true,意味着配置方法会随 Memos 与 Authelia 版本演进而变化,升级版本后建议重新核对两端配置。
集成前的假设与准备
基本假设
本示例基于以下约定展开,你可以将其替换为实际域名:
| 项目 | 值 |
|---|---|
| 应用根 URL(Memos) | https://memos.example.com/ |
| Authelia 根 URL | https://auth.example.com/ |
| Client ID | memos |
| Client Secret | insecure_secret |
配置 OpenID Connect 1.0 客户端前的重要阅读
在正式配置前,有几个来自 Authelia 官方 OIDC 公共注意事项 的约束必须了解:
- client_id 约束:每个客户端必须唯一;文档示例值仅为可读性演示,生产环境应使用 随机生成的客户端标识符(官方推荐 64 个随机字符);只允许包含 RFC3986 非保留字符;长度不超过 100 字符。
- client_secret 约束:示例值
insecure_secret仅用于演示,生产环境绝对不要使用;secret 可以明文存储于配置中,但该行为已弃用,未来版本不保证继续支持;强烈推荐以哈希形式存储(如下文 YAML 中的$pbkdf2-sha512$...格式)。当 secret 以哈希存储时,哈希成本(work factor)过高可能导致客户端超时,可参考 调优 work factors。 - 配置完整性:下文给出的 YAML 仅是客户端注册的示例配置,你还必须按照 OpenID Connect 1.0 Provider 配置 完成 Provider 层的必填项(如 issuer、密钥等);同时应通读 OpenID Connect 1.0 Clients 配置 熟悉其余可用选项。
Authelia 侧:注册 Memos 为 OIDC 客户端
完整示例配置
将以下片段合并进 Authelia 的configuration.yml中identity_providers.oidc部分:
identity_providers: oidc: ## OpenID Connect 1.0 Provider 的其余必填配置放在这里。 clients: - client_id: 'memos' client_name: 'Memos' client_secret: '$pbkdf2-sha512$310000$c8p78n7pUMln0jzvd4aK4Q$JNRBzwAo0ek5qKn50cFzzvE9RXV88h1wJn5KGiHrD0YKtZaR/nCb2CJPOsKaPK0hjf.9yHxzQGZziziccp6Yng' # 'insecure_secret' 的摘要。 public: false authorization_policy: 'two_factor' require_pkce: false pkce_challenge_method: '' redirect_uris: - 'https://memos.example.com/auth/callback' scopes: - 'openid' - 'profile' - 'email' response_types: - 'code' grant_types: - 'authorization_code' access_token_signed_response_alg: 'none' userinfo_signed_response_alg: 'none' token_endpoint_auth_method: 'client_secret_post'关键参数逐项解析
以下参数说明综合自 Clients 配置文档 与 配置 Schema 源码:
- client_id / client_name:客户端唯一标识与 UI 展示名。
client_name默认与 id 相同,仅在界面上显示,不影响协议行为。 - client_secret:Authelia 与 Memos 共享的机密。示例中给出的
$pbkdf2-sha512$...是insecure_secret的 PBKDF2-SHA512 哈希摘要(迭代 310000 次),这正是"secret 哈希存储"的推荐形态。可通过authelia crypto hash generate pbkdf2 --variant sha512类命令生成自己的摘要(见 commands/crypto_hash.go)。 - public: false:声明为机密(confidential)客户端类型。Memos 是服务端应用,能够安全保管 secret,因此不应设为 public(public 要求 secret 为空字符串)。
- authorization_policy: 'two_factor':该客户端在授权请求时要求用户完成双因素认证。取值可以是
one_factor、two_factor,或 Provider 层authorization_policies中自定义的策略名。校验逻辑见 validator/identity_providers.go:非法值会直接报错拒绝启动。 - require_pkce: false / pkce_challenge_method: '':本示例未强制 PKCE。需要说明的是,
pkce_challenge_method若配置为S256或plain会同时隐式启用require_pkce;官方强烈建议 Relying Party 支持时使用S256。Memos 当前版本的 OAuth2 客户端能力有限,故文档按关闭状态配置(安全加固建议见文末)。 - redirect_uris:回调白名单,必须与 Memos 实际回调地址完全一致且大小写敏感,
https://memos.example.com/auth/callback是 Memos 的 OAuth2 回调路径。不在列表中的 URI 会被拒绝授权。 - scopes:
openid、profile、email,与 Memos 端声明的 Scopes 对应。scope 定义见 OpenID Connect 1.0 Claims 参考。 - response_types: ['code']:仅启用授权码流程(Authorization Code Flow),这是官方推荐的最安全响应类型。Schema 源码允许的取值还包括
id_token、token、code token等隐式/混合流程值,但均不如此处安全。 - grant_types: ['authorization_code']:仅允许授权码授权方式。
- access_token_signed_response_alg: 'none' / userinfo_signed_response_alg: 'none':Access Token 与 UserInfo 响应不签名(Memos 按普通 JSON 解析 UserInfo)。若改为非
none值,Access Token 将按 RFC9068 编码为 JWT,UserInfo 则返回application/jwt格式,多数客户端并不支持,保持none即可。 - token_endpoint_auth_method: 'client_secret_post':Memos 通过 HTTP POST body 提交 client_id 与 client_secret 向 Token 端点认证。这是 Memos 支持的方式;若发现认证失败,需先确认客户端是否对凭证做了 RFC6749 Appendix B 所要求的 URL 编码(见下文"已知注意事项")。
Memos 侧:通过 Web GUI 配置 SSO
Memos 的配置只有一种方式:Web GUI。操作步骤如下:
- 进入 Memos 的设置菜单,选择
SSO,点击create并选择类型OAuth2。 - 模板选择
custom(自定义)。 - 按下表填写各字段:
| 字段 | 值 |
|---|---|
| Name | Authelia |
| Client ID | memos |
| Client secret | insecure_secret |
| Authorization endpoint | https://auth.example.com/api/oidc/authorization |
| Token endpoint | https://auth.example.com/api/oidc/token |
| User endpoint | https://auth.example.com/api/oidc/userinfo |
| Scopes | openid profile email |
| Identifier | preferred_username |
| Display Name | given_name |
email |
端点在 Authelia 中的真实实现
Memos 填写的三个端点并非虚构,它们由 internal/server/handlers.go 中的路由注册真实提供,均挂在 Authelia 根 URL 下:
GET/POST /api/oidc/authorization→ 授权端点,处理OAuth2AuthorizationGET/POST(实现见 handler_oauth2_authorization.go,其中会调用NewAuthorizeRequest构造并校验授权请求,且支持 Pushed Authorization Request 检测)。POST /api/oidc/token→ Token 端点,兑换授权码、签发令牌。GET/POST /api/oidc/userinfo→ UserInfo 端点,返回用户声明(claims)。
更完整的端点清单(含.well-known/openid-configuration发现端点、/jwks.json、introspection、revocation 等)可参考 OpenID Connect 1.0 集成介绍。Memos 这类不支持发现机制的客户端,正是按文档中这些固定路径手工填写的场景。
字段映射的含义
- Scopes:与 Authelia 客户端配置中的 scopes 一一对应,缺少任何一个都会导致 UserInfo 返回的声明不全。
- Identifier / Display Name / Email:Memos 从 UserInfo 响应中提取的声明映射。
preferred_username对应profilescope 下的用户名声明,given_name对应显示名,email对应邮箱声明。Memos 将据此建立本地账号与登录身份的关联。
登录流程:一次完整的 SSO 交互
配置完成后,用户访问 Memos 并点击 OAuth2 登录时,实际发生的调用链为:
- 浏览器重定向至 Authelia 授权端点
https://auth.example.com/api/oidc/authorization,携带client_id=memos、redirect_uri、response_type=code、scope等参数。 - Authelia 校验客户端与回调地址后,展示登录页;由于
authorization_policy: two_factor,用户需完成第一因素(密码)与第二因素认证。 - 认证通过后,浏览器携带授权码回调到
https://memos.example.com/auth/callback。 - Memos 后端以
client_secret_post方式携带凭证,向 Token 端点POST /api/oidc/token兑换 ID Token 与 Access Token。 - Memos 调用 UserInfo 端点
https://auth.example.com/api/oidc/userinfo获取preferred_username、given_name、email等声明,完成本地账号绑定与会话建立。
上述端点在 Authelia 侧均经过限流(rate limit)与 CORS 中间件处理,相关中间件配置可参考 internal/middlewares/rate_limiting.go 与 internal/middlewares/cors.go。
已知注意事项与安全加固建议
结合 OIDC 公共注意事项 与本文配置,以下几点需要特别留意:
- 凭证编码问题:若你在 Memos 中使用包含特殊字符的 Client ID / Client Secret,可能因客户端未按 RFC6749 Appendix B 做 URL 转义而导致认证失败。规避手段是避免在凭证中使用特殊字符,或使用 Authelia 随机密码生成器输出的预编码版本。
- Claim 稳定性:OpenID Connect 规范(5.7 节)要求依赖方以稳定的
sub声明绑定本地账号,而非可变的email/preferred_username。若 Memos 以邮箱等可变声明作为账号标识,需知悉其潜在的身份混淆风险,建议关注 Memos 后续版本是否改进。 - 启用 PKCE:若你使用的 Memos 版本支持 PKCE,强烈建议将 Authelia 侧改为
require_pkce: true与pkce_challenge_method: 'S256',以缓解授权码拦截攻击。 - 更换演示凭证:上线前必须将
memos/insecure_secret替换为随机生成的值,并优先使用 PBKDF2-SHA512 哈希存储 secret(与上文 YAML 中的$pbkdf2-sha512$格式一致),避免明文。 - 回调地址精确匹配:
redirect_uris大小写敏感且必须与 Memos 实际回调完全一致,配置错误会直接导致授权失败。
延伸阅读
- OpenID Connect 1.0 集成介绍:端到端了解 Authelia 支持的响应类型、响应模式、授权类型、客户端认证方法与端点实现。
- OpenID Connect 1.0 Clients 配置:本文涉及参数的完整参考,以及
jwks、consent_mode、claims_policy等进阶选项。 - OpenID Connect 1.0 Provider 配置:Provider 层必填项(issuer、密钥、lifespans 等)。
- OpenID Connect 1.0 常见问题:客户端标识符与 secret 的生成方法、work factors 调优、明文存储弃用说明等。
【免费下载链接】autheliaThe Single Sign-On Multi-Factor portal for web apps. OpenID Certified™ and Post-Quantum Cryptography Ready.项目地址: https://gitcode.com/GitHub_Trending/au/authelia
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考