fix bugs in Build-Your-Own-SSO.md
All checks were successful
Deploy / deploy (push) Successful in 37s

This commit is contained in:
Cat Tom
2026-03-12 01:44:35 +08:00
parent 0786bf7580
commit 735a034c77

View File

@@ -2,7 +2,7 @@
!!! tip "建议" !!! tip "建议"
本文篇幅较长,请善页内搜索 ++ctrl+f++ 与右侧的文章目录 本文篇幅较长,请善页内搜索 ++ctrl+f++ 与右侧的文章目录
## 准备/环境条件 ## 准备/环境条件
@@ -166,10 +166,10 @@ Authentik 前端实现由流程、阶段和输入三者构成:
- 手动编辑 - 手动编辑
- 导入**流程蓝图**: 管理员界面 - 流程与阶段 - 流程 - 导入 - 导入**流程蓝图**: 管理员界面 - 流程与阶段 - 流程 - 导入
- [恢复流程(需邮箱验证)](https://static.cattom.site/authentik-blueprints/forget-password.yaml) - [恢复流程(需邮箱验证)](https://static.cattom.site/authentik-blueprints/forget-password.yaml)
- [删除账户流程](https://static.cattom.site/authentik-blueprints/unenrollment.yaml) - [删除账户流程](https://static.cattom.site/authentik-blueprints/unenrollment.yaml)
- [无密码登录流程(WebAuthn)](https://static.cattom.site/authentik-blueprints/passwordless-login.yaml) - [无密码登录流程(WebAuthn)](https://static.cattom.site/authentik-blueprints/passwordless-login.yaml)
- [邀请注册流程](https://static.cattom.site/authentik-blueprints/enrollment.yaml) - [邀请注册流程](https://static.cattom.site/authentik-blueprints/enrollment.yaml)
### 验证码阶段: Cloudflare Turnstile (可选) ### 验证码阶段: Cloudflare Turnstile (可选)
@@ -194,30 +194,30 @@ Authentik 前端实现由流程、阶段和输入三者构成:
- 管理员界面 - 流程与阶段 - 阶段 - (身份验证阶段) - 流程绑定 - 编辑流程 - 管理员界面 - 流程与阶段 - 阶段 - (身份验证阶段) - 流程绑定 - 编辑流程
- default-authentication-identification: - default-authentication-identification:
- 密码流程 - 密码流程
- 验证码流程 - 验证码流程
- WebAuthn 身份验证器验证流程 - WebAuthn 身份验证器验证流程
- 无密码流程 - 无密码流程
- 恢复流程 - 恢复流程
- default-authentication-mfa-validation: - default-authentication-mfa-validation:
- 设备类型: `静态令牌` `TOTP 身份验证器` `WebAuthn 身份验证器` - 设备类型: `静态令牌` `TOTP 身份验证器` `WebAuthn 身份验证器`
- 未配置操作: 强制用户配置身份验证器 - 未配置操作: 强制用户配置身份验证器
- 配置阶段: - 配置阶段:
- default-authenticator-webauthn-setup - default-authenticator-webauthn-setup
- default-authenticator-totp-setup - default-authenticator-totp-setup
- WebAuthn 用户验证: 如果可用,则首选用户验证,但不是必需的。 - WebAuthn 用户验证: 如果可用,则首选用户验证,但不是必需的。
### 外观 ### 外观
- 转至 管理员界面 - 系统 - 品牌 - 转至 管理员界面 - 系统 - 品牌
- 域名: `authentik.your.domain` - 域名: `authentik.your.domain`
- 品牌设置: - 品牌设置:
- 标题 - 标题
- ... - ...
- 默认流程: - 默认流程:
- 恢复流程 - 恢复流程
- 删除账户流程 - 删除账户流程
- ... - ...
## 对接支持 OAuth2/OpenID 的应用 ## 对接支持 OAuth2/OpenID 的应用
@@ -228,22 +228,22 @@ Authentik 前端实现由流程、阶段和输入三者构成:
- 应用名称: 任意字符 - 应用名称: 任意字符
- Slug: 英文字符与数字 - Slug: 英文字符与数字
- 应用界面设置: - 应用界面设置:
- 启动 URL: 对应应用的登录界面 - 启动 URL: 对应应用的登录界面
**第二步 选择提供程序**: OAuth2/OpenID Provider **第二步 选择提供程序**: OAuth2/OpenID Provider
**第三步 配置提供程序**: **第三步 配置提供程序**:
- 授权流程: - 授权流程:
- default-provider-authorization-**implicit**-consent: 用户通过 Authentik 登录对应应用时不需要点击“授权” - default-provider-authorization-**implicit**-consent: 用户通过 Authentik 登录对应应用时不需要点击“授权”
- default-provider-authorization-**explicit**-consent: 用户通过 Authentik 登录对应应用时需要点击“授权” - default-provider-authorization-**explicit**-consent: 用户通过 Authentik 登录对应应用时需要点击“授权”
- 协议设置: - 协议设置:
- 客户端类型: 机密 - 客户端类型: 机密
- 客户端 ID: (自动生成,复制备用) - 客户端 ID: (自动生成,复制备用)
- 客户端 Secret: (自动生成,复制备用) - 客户端 Secret: (自动生成,复制备用)
- 重定向 URL/Origin: (按照应用实际情况添加) - 重定向 URL/Origin: (按照应用实际情况添加)
- 高级流程设置: - 高级流程设置:
- 失效流程: default-provider-invalidation - 失效流程: default-provider-invalidation
**第四步 配置绑定**: (跳过,可后续按照实际情况设置) **第四步 配置绑定**: (跳过,可后续按照实际情况设置)
@@ -258,8 +258,13 @@ Authentik 前端实现由流程、阶段和输入三者构成:
**配置提供程序**: **配置提供程序**:
- 重定向 URL/Origin: - 重定向 URL/Origin:
- `正则表达式` `https://your.openlist.domain/api/auth/sso_callback\?method=get_sso_id` - `正则表达式` `https://your.openlist.domain/api/auth/sso_callback\?method=get_sso_id`
- `正则表达式` `https://your.openlist.domain/api/auth/sso_callback\?method=sso_get_token` - `正则表达式` `https://your.openlist.domain/api/auth/sso_callback\?method=sso_get_token`
!!! warning "注意"
- 记得将 `your.openlist.domain` 替换为你的 OpenList 对应的 FQDN.
- `?` 前的 `\` 是正则表达式中的转义字符,必须保留。
**获取 JWT 证书**: **获取 JWT 证书**:
@@ -267,11 +272,6 @@ Authentik 前端实现由流程、阶段和输入三者构成:
- 找到 `authentik Self-signed Certificate`,点击列表左侧的 `>` - 找到 `authentik Self-signed Certificate`,点击列表左侧的 `>`
- 点击 `下载证书` 以获取 JWT 证书 - 点击 `下载证书` 以获取 JWT 证书
!!! warning "注意"
- 记得将 `your.openlist.domain` 替换为你的 OpenList 对应的 FQDN.
- `?` 前的 `\` 是正则表达式中的转义字符,必须保留。
#### OpenList/AList 配置 #### OpenList/AList 配置
!!! tip "建议" !!! tip "建议"
@@ -293,16 +293,12 @@ Authentik 前端实现由流程、阶段和输入三者构成:
- SSO 自动注册: (按需启用) - SSO 自动注册: (按需启用)
- SSO 默认根目录: `/` (可根据实际情况调整) - SSO 默认根目录: `/` (可根据实际情况调整)
- SSO 默认权限: - SSO 默认权限:
- 默认为 `0`,后续可通过管理界面为用户手动赋权。 - 默认为 `0`,后续可通过管理界面为用户手动赋权。
- 请参考[SSO默认权限 - OpenList文档](https://doc.oplist.org/guide/advanced/sso#_4-4-sso%E9%BB%98%E8%AE%A4%E6%9D%83%E9%99%90) - 请参考[SSO默认权限 - OpenList文档](https://doc.oplist.org/guide/advanced/sso#_4-4-sso%E9%BB%98%E8%AE%A4%E6%9D%83%E9%99%90)
- SSO 兼容模式: 否 - SSO 兼容模式: 否
### Gitea ### Gitea
!!! tip "建议"
在继续操作前,请确保您拥有另一个管理员账户。如果将 Authentik 关联到 Grafana 上唯一的管理员账户,权限可能会被覆盖。
以下配置为个人整理,可能存在错误和缺漏,仅供参考。 以下配置为个人整理,可能存在错误和缺漏,仅供参考。
#### Authentik 配置 #### Authentik 配置
@@ -313,21 +309,21 @@ Authentik 前端实现由流程、阶段和输入三者构成:
- 点击 “创建” - 点击 “创建”
- 选择类型: `Scope Mapping` - 选择类型: `Scope Mapping`
- 创建 Scope Mapping: - 创建 Scope Mapping:
- 名称: `gitea` - 名称: `gitea`
- 作用域名称: `gitea` - 作用域名称: `gitea`
- 表达式: - 表达式:
``` python ``` python
gitea_claims = {} gitea_claims = {}
if request.user.groups.filter(name="gituser").exists(): if request.user.groups.filter(name="gituser").exists():
gitea_claims["gitea"]= "user" gitea_claims["gitea"]= "user"
if request.user.groups.filter(name="gitadmin").exists(): if request.user.groups.filter(name="gitadmin").exists():
gitea_claims["gitea"]= "admin" gitea_claims["gitea"]= "admin"
if request.user.groups.filter(name="gitrestricted").exists(): if request.user.groups.filter(name="gitrestricted").exists():
gitea_claims["gitea"]= "restricted" gitea_claims["gitea"]= "restricted"
return gitea_claims return gitea_claims
``` ```
**设立用户组与添加已有用户进入用户组**: **设立用户组与添加已有用户进入用户组**:
@@ -353,12 +349,12 @@ Authentik 前端实现由流程、阶段和输入三者构成:
- 转至 应用程序 - 应用程序 - 以提供程序创建 - 转至 应用程序 - 应用程序 - 以提供程序创建
- 协议设置: - 协议设置:
- 重定向 URL/Origin: - 重定向 URL/Origin:
- `严格` `https://gitea.your.domain/user/oauth2/[auth_name]/callback` - `严格` `https://gitea.your.domain/user/oauth2/[auth_name]/callback`
- `[auth_name]` 必须与 Gitea 配置中的 `认证名称` 保持一致,大小写敏感。 - `[auth_name]` 必须与 Gitea 配置中的 `认证名称` 保持一致,大小写敏感。
- 高级协议设置: - 高级协议设置:
- 作用域: - 作用域:
- 已选作用域: `OpenID 'email'` `OpenID 'openid'` `OpenID 'profile'` `gitea` - 已选作用域: `OpenID 'email'` `OpenID 'openid'` `OpenID 'profile'` `gitea`
#### Gitea 配置 #### Gitea 配置
@@ -380,6 +376,14 @@ Authentik 前端实现由流程、阶段和输入三者构成:
### Grafana ### Grafana
!!! tip "建议"
在继续操作前,请确保您拥有另一个管理员账户。
如果将 Authentik 关联到 Grafana 上唯一的管理员账户,权限可能会被覆盖。
以下配置为个人整理,可能存在错误和缺漏,仅供参考。
#### Authentik 配置 #### Authentik 配置
**配置属性映射**: **配置属性映射**:
@@ -388,21 +392,21 @@ Authentik 前端实现由流程、阶段和输入三者构成:
- 点击 “创建” - 点击 “创建”
- 选择类型: `Scope Mapping` - 选择类型: `Scope Mapping`
- 创建 Scope Mapping: - 创建 Scope Mapping:
- 名称: `grafana` - 名称: `grafana`
- 作用域名称: `grafana` - 作用域名称: `grafana`
- 表达式: - 表达式:
``` python ``` python
grafana_claims = {} grafana_claims = {}
if request.user.groups.filter(name="Grafana Admins").exists(): if request.user.groups.filter(name="Grafana Admins").exists():
grafana_claims["grafana"]= "GrafanaAdmin" grafana_claims["grafana"]= "GrafanaAdmin"
elif request.user.groups.filter(name="Grafana Editors").exists(): elif request.user.groups.filter(name="Grafana Editors").exists():
grafana_claims["grafana"]= "editor" grafana_claims["grafana"]= "editor"
else: else:
grafana_claims["grafana"]= "viewer" grafana_claims["grafana"]= "viewer"
return grafana_claims return grafana_claims
``` ```
**设立用户组与添加已有用户进入用户组**: **设立用户组与添加已有用户进入用户组**:
@@ -428,38 +432,36 @@ Authentik 前端实现由流程、阶段和输入三者构成:
- 转至 应用程序 - 应用程序 - 以提供程序创建 - 转至 应用程序 - 应用程序 - 以提供程序创建
- 协议设置: - 协议设置:
- 重定向 URL/Origin: - 重定向 URL/Origin:
- `严格` `https://grafana.your.domain/login/generic_oauth` - `严格` `https://grafana.your.domain/login/generic_oauth`
- 高级协议设置: - 高级协议设置:
- 作用域: - 作用域:
- 已选作用域: `OpenID 'email'` `OpenID 'openid'` `OpenID 'profile'` `grafana` - 已选作用域: `OpenID 'email'` `OpenID 'openid'` `OpenID 'profile'` `grafana`
#### Grafana 配置 #### Grafana 配置
- 转至 管理 - 身份验证 - Generic OAuth - 转至 管理 - 身份验证 - Generic OAuth
- 一般设置: - 一般设置:
- 显示名称: (随意) - 显示名称: (随意)
- Client ID: (Authentik 中对应应用的提供程序的客户端 ID) - Client ID: (Authentik 中对应应用的提供程序的客户端 ID)
- Client secret: (Authentik 中对应应用的提供程序的客户端 Secret) - Client secret: (Authentik 中对应应用的提供程序的客户端 Secret)
- 身份验证样式: (保持默认) - 身份验证样式: (保持默认)
- Scopes: `email` `profile` `openid` `grafana` - Scopes: `email` `profile` `openid` `grafana`
- OpenID Connect Discovery URL: (Authentik 中对应应用的提供程序的**OpenID 配置 URL**) - OpenID Connect Discovery URL: (Authentik 中对应应用的提供程序的**OpenID 配置 URL**)
- 允许注册/自动登录: (按照实际情况) - 允许注册/自动登录: (按照实际情况)
- 退出登录重定向网址: (Authentik 中对应应用的提供程序的**注销 URL**) - 退出登录重定向网址: (Authentik 中对应应用的提供程序的**注销 URL**)
- 登录提示: (空) - 登录提示: (空)
- 用户映射: - 用户映射:
- 角色属性路径: `grafana` - 角色属性路径: `grafana`
- 角色属性严格模式/允许分配 Grafana 管理员: 是 - 角色属性严格模式/允许分配 Grafana 管理员: 是
### Immich
请参照 [OAuth Authentication | Immich](https://docs.immich.app/administration/oauth) 完成。
### Jellyfin ### Jellyfin
!!! tip "建议" !!! tip "建议"
在继续操作前,请确保您拥有另一个管理员账户。如果将 Authentik 关联到 Jellyfin 上唯一的管理员账户,[权限可能会被覆盖](https://github.com/9p4/jellyfin-plugin-sso/issues/212)。 在继续操作前,请确保您拥有另一个管理员账户。
如果将 Authentik 关联到 Jellyfin 上唯一的管理员账户,[权限可能会被覆盖](https://github.com/9p4/jellyfin-plugin-sso/issues/212)。
以下内容综合自 [jellyfin-plugin-sso/providers.md at main · 9p4/jellyfin-plugin-sso](https://github.com/9p4/jellyfin-plugin-sso/blob/main/providers.md#authentik) 与 [Integrate with Jellyfin | authentik](https://integrations.goauthentik.io/media/jellyfin/)。 以下内容综合自 [jellyfin-plugin-sso/providers.md at main · 9p4/jellyfin-plugin-sso](https://github.com/9p4/jellyfin-plugin-sso/blob/main/providers.md#authentik) 与 [Integrate with Jellyfin | authentik](https://integrations.goauthentik.io/media/jellyfin/)。
@@ -487,18 +489,23 @@ Authentik 前端实现由流程、阶段和输入三者构成:
- 转至 应用程序 - 应用程序 - 以提供程序创建 - 转至 应用程序 - 应用程序 - 以提供程序创建
- 协议设置: - 协议设置:
- 重定向 URL/Origin: - 重定向 URL/Origin:
- `严格` `http://jellyfin.your.domain/sso/OID/redirect/[Name of OpenID Provider]` - `严格` `http://jellyfin.your.domain/sso/OID/redirect/[Name of OpenID Provider]`
- `[Name of OpenID Provider]` 必须与 Jellyfin 配置中的 `Name of OpenID Provider` 保持一致,大小写敏感。 - `[Name of OpenID Provider]` 必须与 Jellyfin 配置中的 `Name of OpenID Provider` 保持一致,大小写敏感。
#### Jellyfin 配置 #### Jellyfin 配置
**安装 SSO-Auth 插件**:
- 转至 管理 - 控制台 - 插件 - 转至 管理 - 控制台 - 插件
- 点击 “管理存储库” - “新建存储库” - 点击 “管理存储库” - “新建存储库”
- 存储库名称: `jellyfin plugin sso` - 存储库名称: `jellyfin plugin sso`
- 存储库 URL: `https://raw.githubusercontent.com/9p4/jellyfin-plugin-sso/manifest-release/manifest.json` - 存储库 URL: `https://raw.githubusercontent.com/9p4/jellyfin-plugin-sso/manifest-release/manifest.json`
- 返回上一级 - “可用” - 找到“SSO-Auth” - 安装 - 返回上一级 - “可用” - 找到“SSO-Auth” - 安装
- 重启 Jellyfin - 重启 Jellyfin
**配置 SSO-Auth 插件**:
- 管理 - 控制台 - 插件 - SSO-Auth - 设置 - 管理 - 控制台 - 插件 - SSO-Auth - 设置
- Name of OpenID Provider: (必须与 Authentik 配置中的 `[Name of OpenID Provider]`保持一致,大小写敏感) - Name of OpenID Provider: (必须与 Authentik 配置中的 `[Name of OpenID Provider]`保持一致,大小写敏感)
- OpenID Endpoint: (Authentik 中对应应用的提供程序的**OpenID 配置 URL**) - OpenID Endpoint: (Authentik 中对应应用的提供程序的**OpenID 配置 URL**)
@@ -516,23 +523,23 @@ Authentik 前端实现由流程、阶段和输入三者构成:
**以下内容基于 Windows 11 & Jellyfin Server 10.11.6,仅供参考。** **以下内容基于 Windows 11 & Jellyfin Server 10.11.6,仅供参考。**
- 暂时移除 SSO 插件: - 暂时移除 SSO 插件:
- 停止 Jellyfin 服务器 - 停止 Jellyfin 服务器
- 定位 Jellyfin 的 `plugins` 文件夹: - 定位 Jellyfin 的 `plugins` 文件夹:
- `%LocalAppData%\Jellyfin\plugins` - `%LocalAppData%\Jellyfin\plugins`
- `C:\ProgramData\Jellyfin\Server\plugins` - `C:\ProgramData\Jellyfin\Server\plugins`
- 找到名为 sso-auth (或类似名称)的文件夹,将其剪切并移动到桌面暂时备份 - 找到名为 sso-auth (或类似名称)的文件夹,将其剪切并移动到桌面暂时备份
- 重新触发配置向导: - 重新触发配置向导:
- 定位 Jellyfin 的 `config` 文件夹: - 定位 Jellyfin 的 `config` 文件夹:
- `%LocalAppData%\Jellyfin\config` - `%LocalAppData%\Jellyfin\config`
- `C:\ProgramData\Jellyfin\Server\config` - `C:\ProgramData\Jellyfin\Server\config`
- 找到 `system.xml` 文件,右键使用记事本打开 - 找到 `system.xml` 文件,右键使用记事本打开
- 在文件中搜索 `<IsStartupWizardCompleted>true</IsStartupWizardCompleted>` - 在文件中搜索 `<IsStartupWizardCompleted>true</IsStartupWizardCompleted>`
- 将 true 改为 false: `<IsStartupWizardCompleted>false</IsStartupWizardCompleted>` - 将 true 改为 false: `<IsStartupWizardCompleted>false</IsStartupWizardCompleted>`
- 保存并关闭该文件 - 保存并关闭该文件
- 重新启动 Jellyfin - 重新启动 Jellyfin
- 在浏览器中打开 `http://localhost:8096`,此时系统会弹出首次安装的设置向导 - 在浏览器中打开 `http://localhost:8096`,此时系统会弹出首次安装的设置向导
- 按照向导创建一个全新的管理员账户,添加媒体库的步骤可以跳过 - 按照向导创建一个全新的管理员账户,添加媒体库的步骤可以跳过
- 设置完成后,使用新创建的管理员账户登录 - 设置完成后,使用新创建的管理员账户登录
### Memos ### Memos
@@ -542,11 +549,11 @@ Authentik 前端实现由流程、阶段和输入三者构成:
- 转至 应用程序 - 应用程序 - 以提供程序创建 - 转至 应用程序 - 应用程序 - 以提供程序创建
- 协议设置: - 协议设置:
- 重定向 URL/Origin: - 重定向 URL/Origin:
- `严格` `https://memos.your.domain/auth/callback` - `严格` `https://memos.your.domain/auth/callback`
- 高级协议设置: - 高级协议设置:
- 已选作用域: `OpenID 'email'` `OpenID 'openid'` - 已选作用域: `OpenID 'email'` `OpenID 'openid'`
- Subject 模式: `基于用户名` - Subject 模式: `基于用户名`
#### Memos 配置 #### Memos 配置
@@ -592,8 +599,8 @@ Authentik 前端实现由流程、阶段和输入三者构成:
- 转至 应用程序 - 应用程序 - 以提供程序创建 - 转至 应用程序 - 应用程序 - 以提供程序创建
- 协议设置: - 协议设置:
- 重定向 URL/Origin: - 重定向 URL/Origin:
- `严格` `https://proxmox.your.domain` - `严格` `https://proxmox.your.domain`
#### Proxmox 配置 #### Proxmox 配置
@@ -620,7 +627,7 @@ Authentik 前端实现由流程、阶段和输入三者构成:
- 转至 数据中心 - 权限 - 群组 - 转至 数据中心 - 权限 - 群组
- 点击 创建 - 点击 创建
- 名称: `[Authentik 用户组名称]-[领域名称]` - 名称: `[Authentik 用户组名称]-[领域名称]`
- 若 Authentik 用户组名称为 `proxmox-admins`,领域名称为 `SSO`,那么该群组的名称为 `proxmox-admins-SSO` - 若 Authentik 用户组名称为 `proxmox-admins`,领域名称为 `SSO`,那么该群组的名称为 `proxmox-admins-SSO`
**预配置权限**: **预配置权限**:
@@ -641,10 +648,10 @@ Authentik 前端实现由流程、阶段和输入三者构成:
- 转至 应用程序 - 应用程序 - 以提供程序创建 - 转至 应用程序 - 应用程序 - 以提供程序创建
- 协议设置: - 协议设置:
- 重定向 URL/Origin: - 重定向 URL/Origin:
- `严格` `https://vaultwarden.your.domain/identity/connect/oidc-signin` - `严格` `https://vaultwarden.your.domain/identity/connect/oidc-signin`
- 高级协议设置: - 高级协议设置:
- 已选作用域: `OpenID 'email'` `OpenID 'openid'` `OpenID 'profile'` `OpenID 'offline_access'` - 已选作用域: `OpenID 'email'` `OpenID 'openid'` `OpenID 'profile'` `OpenID 'offline_access'`
#### Vaultwarden 配置 #### Vaultwarden 配置
@@ -670,8 +677,8 @@ environment:
- 转至 应用程序 - 应用程序 - 以提供程序创建 - 转至 应用程序 - 应用程序 - 以提供程序创建
- 协议设置: - 协议设置:
- 重定向 URL/Origin: - 重定向 URL/Origin:
- `严格` `https://wallos.your.domain` - `严格` `https://wallos.your.domain`
#### Wallos 配置 #### Wallos 配置
@@ -689,6 +696,10 @@ environment:
- Scopes: `openid` `email` `profile` - Scopes: `openid` `email` `profile`
- 当使用 OIDC 登录时自动创建用户/禁用密码登录: (依照实际情况) - 当使用 OIDC 登录时自动创建用户/禁用密码登录: (依照实际情况)
### Immich
请参照 [OAuth Authentication | Immich](https://docs.immich.app/administration/oauth) 完成。
## 参考/进一步阅读 ## 参考/进一步阅读
- [Memos 对接 Authentik | 某科学的贝壳](https://blog.ning.moe/posts/authentik-OAuth2-memos/) - [Memos 对接 Authentik | 某科学的贝壳](https://blog.ning.moe/posts/authentik-OAuth2-memos/)