Files
blog/docs/tech/Build-Your-Own-SSO.md
Cat Tom 0786bf7580
All checks were successful
Deploy / deploy (push) Successful in 36s
add Build-Your-Own-SSO.md
2026-03-12 01:27:14 +08:00

698 lines
24 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Authentik: 搭建属于自己的单点登录服务
!!! tip "建议"
本文篇幅较长,请善于页内搜索 ++ctrl+f++ 与右侧的文章目录
## 准备/环境条件
- 域名
- Ubuntu 24.04 LTS
- Authentik 2026.2.1
- Traefik (Nginx / Caddy 亦可)
- Docker & Docker Compose
## 安装
安装步骤基本依照 [Docker Compose installation - authentik](https://docs.goauthentik.io/install-config/install/docker-compose/) 完成。
首先,编写 `docker-compose.yml`Authentik 由 `PostgreSQL` `Server` `Worker` 三部分构成。
``` yaml title="docker-compose.yml"
services:
authentik_postgresql:
image: docker.io/library/postgres:16-alpine
container_name: authentik_postgresql
volumes:
- /path/to/authentik/database:/var/lib/postgresql/data
networks:
- authentik_network
environment:
POSTGRES_PASSWORD: ${PG_PASS:?database password required}
POSTGRES_USER: ${PG_USER:-authentik}
POSTGRES_DB: ${PG_DB:-authentik}
healthcheck:
interval: 30s
retries: 5
start_period: 20s
test:
- CMD-SHELL
- pg_isready -d $${POSTGRES_DB} -U $${POSTGRES_USER}
timeout: 5s
env_file:
- .env
restart: unless-stopped
authentik_server:
image: ${AUTHENTIK_IMAGE:-ghcr.io/goauthentik/server}:${AUTHENTIK_TAG:-2026.2}
container_name: authentik_server
command: server
ports:
- "9000:9000" # For authentik embedded outpost
networks:
- basic_network
- authentik_network
volumes:
- /path/to/authentik/data:/data
- /path/to/authentik/custom-templates:/templates
environment:
AUTHENTIK_POSTGRESQL__HOST: authentik_postgresql
AUTHENTIK_POSTGRESQL__USER: ${PG_USER:-authentik}
AUTHENTIK_POSTGRESQL__NAME: ${PG_DB:-authentik}
AUTHENTIK_POSTGRESQL__PASSWORD: ${PG_PASS}
AUTHENTIK_SECRET_KEY: ${AUTHENTIK_SECRET_KEY:?secret key required}
env_file:
- .env
depends_on:
authentik_postgresql:
condition: service_healthy
restart: unless-stopped
shm_size: 512mb
labels:
- "traefik.enable=true"
- "traefik.docker.network=basic_network"
# HTTPS part:
- "traefik.http.routers.authentik-secure.entrypoints=web-secure"
- "traefik.http.routers.authentik-secure.tls=true"
- "traefik.http.routers.authentik-secure.tls.certresolver=letsencrypt"
- "traefik.http.routers.authentik-secure.rule=Host(`your.authentik.domain`)"
- "traefik.http.routers.authentik-secure.middlewares=default@file"
# Upstream part:
- "traefik.http.services.authentik.loadbalancer.server.scheme=http"
- "traefik.http.services.authentik.loadbalancer.server.port=9000" # Authentik default http port
authentik_worker:
image: ${AUTHENTIK_IMAGE:-ghcr.io/goauthentik/server}:${AUTHENTIK_TAG:-2026.2}
container_name: authentik_worker
command: worker
networks:
- authentik_network
environment:
AUTHENTIK_POSTGRESQL__HOST: authentik_postgresql
AUTHENTIK_POSTGRESQL__USER: ${PG_USER:-authentik}
AUTHENTIK_POSTGRESQL__NAME: ${PG_DB:-authentik}
AUTHENTIK_POSTGRESQL__PASSWORD: ${PG_PASS}
AUTHENTIK_SECRET_KEY: ${AUTHENTIK_SECRET_KEY:?secret key required}
user: root
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- /path/to/authentik/data:/data
- /path/to/authentik/certs:/certs
- /path/to/authentik/custom-templates:/templates
env_file:
- .env
depends_on:
authentik_postgresql:
condition: service_healthy
restart: unless-stopped
networks:
basic_network:
name: basic_network
authentik_network:
name: authentik_network
```
然后,创建配置文件 `.env`,并生成数据库密码和 Authentik 密钥。
``` bash
touch .env
echo "PG_PASS=$(openssl rand -base64 36 | tr -d '\n')" >> .env
echo "AUTHENTIK_SECRET_KEY=$(openssl rand -base64 60 | tr -d '\n')" >> .env
```
接着,继续编辑配置文件 `.env`,添加邮件发送配置,以下以腾讯企业邮箱(即企业微信邮箱)为例。
``` yaml title=".env"
PG_PASS=(Automatically generated from the previous step)
AUTHENTIK_SECRET_KEY=(Automatically generated from the previous step)
# SMTP Host Emails are sent to
AUTHENTIK_EMAIL__HOST=smtp.exmail.qq.com
AUTHENTIK_EMAIL__PORT=465
# Optionally authenticate (don't add quotation marks to your password)
AUTHENTIK_EMAIL__USERNAME=authentik@your.domain
AUTHENTIK_EMAIL__PASSWORD=(Tencent Enterprise Email SMTP password)
# Use StartTLS
AUTHENTIK_EMAIL__USE_TLS=false
# Use SSL
AUTHENTIK_EMAIL__USE_SSL=true
AUTHENTIK_EMAIL__TIMEOUT=10
# Email address authentik will send from, should have a correct @domain
AUTHENTIK_EMAIL__FROM=authentik@your.domain
```
最后,启动 Authentik 服务。
``` bash
docker compose pull
docker compose up -d
```
Authentik 正常启动后,请访问 `https://your.authentik.domain/if/flow/initial-setup/` 完成初始化配置。
## 自定义
### 流程、阶段和输入
Authentik 前端实现由流程、阶段和输入三者构成:
- 流程是由一系列用于对用户进行身份验证、注册或恢复的阶段构成。
- 阶段是引导用户完成流程的单个步骤。
- 输入是可用于输入阶段的单个输入项。
自定义流程、阶段和输入有两种办法:
- 手动编辑
- 导入**流程蓝图**: 管理员界面 - 流程与阶段 - 流程 - 导入
- [恢复流程(需邮箱验证)](https://static.cattom.site/authentik-blueprints/forget-password.yaml)
- [删除账户流程](https://static.cattom.site/authentik-blueprints/unenrollment.yaml)
- [无密码登录流程(WebAuthn)](https://static.cattom.site/authentik-blueprints/passwordless-login.yaml)
- [邀请注册流程](https://static.cattom.site/authentik-blueprints/enrollment.yaml)
### 验证码阶段: Cloudflare Turnstile (可选)
**Cloudflare**:
- (当前项目) - 应用程序安全 - Turnstile
- 小组件名称: (随意)
- 主机名管理: (按实际情况)
- 小组件模式: 托管
- 您是否要为此站点选择预先许可: 否
**Authentik**:
- 管理员界面 - 流程与阶段 - 阶段 - 创建
- 选择 `Captcha Stage`
- Stage Name: (随意)
- 提供程序类型: `Cloudflare Turnstile`
- 公钥: (Cloudflare 提供的**站点密钥**)
- Secret Key: (Cloudflare 提供的**密钥**)
### 登录流程优化
- 管理员界面 - 流程与阶段 - 阶段 - (身份验证阶段) - 流程绑定 - 编辑流程
- default-authentication-identification:
- 密码流程
- 验证码流程
- WebAuthn 身份验证器验证流程
- 无密码流程
- 恢复流程
- default-authentication-mfa-validation:
- 设备类型: `静态令牌` `TOTP 身份验证器` `WebAuthn 身份验证器`
- 未配置操作: 强制用户配置身份验证器
- 配置阶段:
- default-authenticator-webauthn-setup
- default-authenticator-totp-setup
- WebAuthn 用户验证: 如果可用,则首选用户验证,但不是必需的。
### 外观
- 转至 管理员界面 - 系统 - 品牌
- 域名: `authentik.your.domain`
- 品牌设置:
- 标题
- ...
- 默认流程:
- 恢复流程
- 删除账户流程
- ...
## 对接支持 OAuth2/OpenID 的应用
进入 Authentik 管理员界面后,找到应用程序 - 应用程序 - `以提供程序创建`。
**第一步 应用程序**:
- 应用名称: 任意字符
- Slug: 英文字符与数字
- 应用界面设置:
- 启动 URL: 对应应用的登录界面
**第二步 选择提供程序**: OAuth2/OpenID Provider
**第三步 配置提供程序**:
- 授权流程:
- default-provider-authorization-**implicit**-consent: 用户通过 Authentik 登录对应应用时不需要点击“授权”
- default-provider-authorization-**explicit**-consent: 用户通过 Authentik 登录对应应用时需要点击“授权”
- 协议设置:
- 客户端类型: 机密
- 客户端 ID: (自动生成,复制备用)
- 客户端 Secret: (自动生成,复制备用)
- 重定向 URL/Origin: (按照应用实际情况添加)
- 高级流程设置:
- 失效流程: default-provider-invalidation
**第四步 配置绑定**: (跳过,可后续按照实际情况设置)
**第五步 检查与提交应用程序**: (检查无误后,点击“提交”)
### OpenList/AList
以下步骤基本参照 [单点登录 - OpenList文档](https://doc.oplist.org/guide/advanced/sso#_3-6-authentik) 完成。
#### Authentik 配置
**配置提供程序**:
- 重定向 URL/Origin:
- `正则表达式` `https://your.openlist.domain/api/auth/sso_callback\?method=get_sso_id`
- `正则表达式` `https://your.openlist.domain/api/auth/sso_callback\?method=sso_get_token`
**获取 JWT 证书**:
- 转至 系统 - 证书
- 找到 `authentik Self-signed Certificate`,点击列表左侧的 `>`
- 点击 `下载证书` 以获取 JWT 证书
!!! warning "注意"
- 记得将 `your.openlist.domain` 替换为你的 OpenList 对应的 FQDN.
- `?` 前的 `\` 是正则表达式中的转义字符,必须保留。
#### OpenList/AList 配置
!!! tip "建议"
建议默认管理员账户不绑定单点绑定服务,以避免可能的权限混乱。
转至 OpenList/AList 管理 - 设置 - 单点登录
- SSO 登录启用: 是
- SSO 登录平台: `OIDC`
- SSO 客户端 ID: (Authentik 中对应应用的提供程序的客户端 ID)
- SSO 客户端密钥: (Authentik 中对应应用的提供程序的客户端 Secret)
- OIDC 用户名键: `preferred_username`
- 组织名称: `user`
- SSO 应用名称: `user`
- SSO 端点名称: (Authentik 中对应应用的提供程序的**OpenID 配置颁发者**)
- SSO JWT 公钥: 打开先前下载的 JWT 证书,并将全部内容粘贴在输入框中。应以 -----BEGIN CERTIFICATE----- 开头。
- SSO 额外范围: (空)
- SSO 自动注册: (按需启用)
- SSO 默认根目录: `/` (可根据实际情况调整)
- SSO 默认权限:
- 默认为 `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 兼容模式: 否
### Gitea
!!! tip "建议"
在继续操作前,请确保您拥有另一个管理员账户。如果将 Authentik 关联到 Grafana 上唯一的管理员账户,权限可能会被覆盖。
以下配置为个人整理,可能存在错误和缺漏,仅供参考。
#### Authentik 配置
**配置属性映射**:
- 转至 自定义 - 属性映射
- 点击 “创建”
- 选择类型: `Scope Mapping`
- 创建 Scope Mapping:
- 名称: `gitea`
- 作用域名称: `gitea`
- 表达式:
``` python
gitea_claims = {}
if request.user.groups.filter(name="gituser").exists():
gitea_claims["gitea"]= "user"
if request.user.groups.filter(name="gitadmin").exists():
gitea_claims["gitea"]= "admin"
if request.user.groups.filter(name="gitrestricted").exists():
gitea_claims["gitea"]= "restricted"
return gitea_claims
```
**设立用户组与添加已有用户进入用户组**:
请分别创建名为 `gitadmin` `gituser` `gitrestricted` 的用户组。
- 转至 目录 - 组
- 点击 “新建组”
- 组名: `gitadmin` `gituser` `gitrestricted`
- 超级用户权限: 否
- 父级: (空)
- 角色: (空)
- 属性: (保持默认)
接下来,将已有的用户添加进入对应的用户组。
- 点击 `gitadmin` `gituser` 或 `gitrestricted` 用户组
- 点击 用户 - 添加已有用户
- 将用户添加进入 `gitadmin` 用户组意味着将授予该用户 Gitea 管理员权限
- 将用户添加进入 `gituser` 用户组意味着允许该用户正常使用 Gitea
- 将用户添加进入 `gitrestricted` 用户组意味着用户将不可使用 Gitea
**配置提供程序**:
- 转至 应用程序 - 应用程序 - 以提供程序创建
- 协议设置:
- 重定向 URL/Origin:
- `严格` `https://gitea.your.domain/user/oauth2/[auth_name]/callback`
- `[auth_name]` 必须与 Gitea 配置中的 `认证名称` 保持一致,大小写敏感。
- 高级协议设置:
- 作用域:
- 已选作用域: `OpenID 'email'` `OpenID 'openid'` `OpenID 'profile'` `gitea`
#### Gitea 配置
- 转至 管理后台 - 身份及认证 - 认证源 - 添加认证源
- 认证类型: `OAuth2`
- 认证名称: (必须与 Authentik 配置中的 `[auth_name]` 保持一致,大小写敏感)
- OAuth2 提供程序: `OpenID Connect`
- 客户端 ID: (Authentik 中对应应用的提供程序的客户端 ID)
- 客户端密钥: (Authentik 中对应应用的提供程序的客户端 Secret)
- 图标URL: (按照实际情况填写)
- OpenID 连接自动发现 URL: (Authentik 中对应应用的提供程序的**OpenID 配置 URL**)
- 附加授权范围 (Scopes): `email profile gitea openid`
- 全名声明名称/SSH 公钥声明名称: (空)
- 必须填写 Claim 声明的名称: `gitea`
- 用于提供用户组名称的 Claim 声明名称: `gitea`
- 管理员用户组的 Claim 声明值: `admin`
- 受限用户组的 Claim 声明值: `restricted`
- 如果用户不属于相应的组,从已同步团队中移除用户/启用用户同步/该认证源已经启用: 是
### Grafana
#### Authentik 配置
**配置属性映射**:
- 转至 自定义 - 属性映射
- 点击 “创建”
- 选择类型: `Scope Mapping`
- 创建 Scope Mapping:
- 名称: `grafana`
- 作用域名称: `grafana`
- 表达式:
``` python
grafana_claims = {}
if request.user.groups.filter(name="Grafana Admins").exists():
grafana_claims["grafana"]= "GrafanaAdmin"
elif request.user.groups.filter(name="Grafana Editors").exists():
grafana_claims["grafana"]= "editor"
else:
grafana_claims["grafana"]= "viewer"
return grafana_claims
```
**设立用户组与添加已有用户进入用户组**:
请分别创建名为 `Grafana Admins` `Grafana Editors` 的用户组。
- 转至 目录 - 组
- 点击 “新建组”
- 组名: `Grafana Admins` `Grafana Editors`
- 超级用户权限: 否
- 父级: (空)
- 角色: (空)
- 属性: (保持默认)
接下来,将已有的用户添加进入对应的用户组。
- 点击 `Grafana Admins` `Grafana Editors` 用户组
- 点击 用户 - 添加已有用户
- 将用户添加进入 `Grafana Admins` 用户组意味着将授予该用户 Grafana 管理员权限
- 将用户添加进入 `Grafana Editors` 用户组意味着允许该用户修改仪表盘数据
- 不属于上述用户组的用户仅可查看公开的仪表盘
**配置提供程序**:
- 转至 应用程序 - 应用程序 - 以提供程序创建
- 协议设置:
- 重定向 URL/Origin:
- `严格` `https://grafana.your.domain/login/generic_oauth`
- 高级协议设置:
- 作用域:
- 已选作用域: `OpenID 'email'` `OpenID 'openid'` `OpenID 'profile'` `grafana`
#### Grafana 配置
- 转至 管理 - 身份验证 - Generic OAuth
- 一般设置:
- 显示名称: (随意)
- Client ID: (Authentik 中对应应用的提供程序的客户端 ID)
- Client secret: (Authentik 中对应应用的提供程序的客户端 Secret)
- 身份验证样式: (保持默认)
- Scopes: `email` `profile` `openid` `grafana`
- OpenID Connect Discovery URL: (Authentik 中对应应用的提供程序的**OpenID 配置 URL**)
- 允许注册/自动登录: (按照实际情况)
- 退出登录重定向网址: (Authentik 中对应应用的提供程序的**注销 URL**)
- 登录提示: (空)
- 用户映射:
- 角色属性路径: `grafana`
- 角色属性严格模式/允许分配 Grafana 管理员: 是
### Immich
请参照 [OAuth Authentication | Immich](https://docs.immich.app/administration/oauth) 完成。
### Jellyfin
!!! tip "建议"
在继续操作前,请确保您拥有另一个管理员账户。如果将 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/)。
#### Authentik 配置
**设立用户组与添加已有用户进入用户组**:
请创建名为 `jellyfin` 的用户组。
- 转至 目录 - 组
- 点击 “新建组”
- 组名: `jellyfin`
- 超级用户权限: 否
- 父级: (空)
- 角色: (空)
- 属性: (保持默认)
接下来,将已有的用户添加进入对应的用户组。
- 点击 `jellyfin` 用户组
- 点击 用户 - 添加已有用户
- 将用户添加进入 `jellyfin` 用户组意味着用户可正常使用 Jellyfin
**配置提供程序**:
- 转至 应用程序 - 应用程序 - 以提供程序创建
- 协议设置:
- 重定向 URL/Origin:
- `严格` `http://jellyfin.your.domain/sso/OID/redirect/[Name of OpenID Provider]`
- `[Name of OpenID Provider]` 必须与 Jellyfin 配置中的 `Name of OpenID Provider` 保持一致,大小写敏感。
#### Jellyfin 配置
- 转至 管理 - 控制台 - 插件
- 点击 “管理存储库” - “新建存储库”
- 存储库名称: `jellyfin plugin sso`
- 存储库 URL: `https://raw.githubusercontent.com/9p4/jellyfin-plugin-sso/manifest-release/manifest.json`
- 返回上一级 - “可用” - 找到“SSO-Auth” - 安装
- 重启 Jellyfin
- 管理 - 控制台 - 插件 - SSO-Auth - 设置
- Name of OpenID Provider: (必须与 Authentik 配置中的 `[Name of OpenID Provider]`保持一致,大小写敏感)
- OpenID Endpoint: (Authentik 中对应应用的提供程序的**OpenID 配置 URL**)
- OpenID Client ID: (Authentik 中对应应用的提供程序的客户端 ID)
- OpenID client secret: (Authentik 中对应应用的提供程序的客户端 Secret)
- Enabled/Enable Authorization by Plugin/Enable All Folders: 是
- Roles: `jellyfin`
- Enable Live TV RBAC: 是
- Live TV Roles: `jellyfin`
- Role Claim: `groups`
- Request Additional Scopes: `["groups"]`
#### 恢复 Jellyfin 管理员权限 (错误配置 SSO-Auth 插件)
**以下内容基于 Windows 11 & Jellyfin Server 10.11.6,仅供参考。**
- 暂时移除 SSO 插件:
- 停止 Jellyfin 服务器
- 定位 Jellyfin 的 `plugins` 文件夹:
- `%LocalAppData%\Jellyfin\plugins`
- `C:\ProgramData\Jellyfin\Server\plugins`
- 找到名为 sso-auth (或类似名称)的文件夹,将其剪切并移动到桌面暂时备份
- 重新触发配置向导:
- 定位 Jellyfin 的 `config` 文件夹:
- `%LocalAppData%\Jellyfin\config`
- `C:\ProgramData\Jellyfin\Server\config`
- 找到 `system.xml` 文件,右键使用记事本打开
- 在文件中搜索 `<IsStartupWizardCompleted>true</IsStartupWizardCompleted>`
- 将 true 改为 false: `<IsStartupWizardCompleted>false</IsStartupWizardCompleted>`
- 保存并关闭该文件
- 重新启动 Jellyfin
- 在浏览器中打开 `http://localhost:8096`,此时系统会弹出首次安装的设置向导
- 按照向导创建一个全新的管理员账户,添加媒体库的步骤可以跳过
- 设置完成后,使用新创建的管理员账户登录
### Memos
#### Authentik 配置
**配置提供程序**:
- 转至 应用程序 - 应用程序 - 以提供程序创建
- 协议设置:
- 重定向 URL/Origin:
- `严格` `https://memos.your.domain/auth/callback`
- 高级协议设置:
- 已选作用域: `OpenID 'email'` `OpenID 'openid'`
- Subject 模式: `基于用户名`
#### Memos 配置
- 转至 设置 - 管理 - 单点登录 - 创建
- 类型: `OAUTH2`
- 模板: `Custom`
- 名称: (随意)
- 标识符过滤器: (空)
- 客户端ID: (Authentik 中对应应用的提供程序的客户端 ID)
- 客户端密钥: (Authentik 中对应应用的提供程序的客户端 Secret)
- 授权端点: (Authentik 中对应应用的提供程序的**授权 URL**)
- 令牌端点: (Authentik 中对应应用的提供程序的**令牌 URL**)
- 用户端点: (Authentik 中对应应用的提供程序的**用户信息 URL**)
- 范围: `openid` `email`
- 标识符: `sub`
- 显示名称: `sub`
- 邮箱: `email`
- Avatar URL: (空)
### Proxmox
#### Authentik 配置
**设立用户组与添加已有用户进入用户组**:
请创建名为 `proxmox-admins` 的用户组。
- 转至 目录 - 组
- 点击 “新建组”
- 组名: `proxmox-admins`
- 超级用户权限: 否
- 父级: (空)
- 角色: (空)
- 属性: (保持默认)
接下来,将已有的用户添加进入对应的用户组。
- 点击 `proxmox-admins` 用户组
- 点击 用户 - 添加已有用户
- 将用户添加进入 `proxmox-admins` 用户组意味着**用户将具有 Proxmox 面板与服务器的管理员权限**
**配置提供程序**:
- 转至 应用程序 - 应用程序 - 以提供程序创建
- 协议设置:
- 重定向 URL/Origin:
- `严格` `https://proxmox.your.domain`
#### Proxmox 配置
**配置单点登录**:
- 转至 数据中心 - 权限 - 领域
- 点击 添加 - OpenID 连接服务器
- 发行人URL: (Authentik 中对应应用的提供程序的**OpenID 配置颁发者**)
- 领域: (指单点登录服务的名称,随意)
- 客户端 ID: (Authentik 中对应应用的提供程序的客户端 ID)
- 客户端秘钥: (Authentik 中对应应用的提供程序的客户端 Secret)
- 范围: (保持默认)
- 默认: (按照实际情况)
- 自动创建用户: 是
- 用户名声明: `username`
- Autocreate Groups: 否
- Groups Claim: `groups`
- Overwrite Groups: 否
- 提示: (保持默认)
- Query userinfo endpoint: 是
**创建群组**:
- 转至 数据中心 - 权限 - 群组
- 点击 创建
- 名称: `[Authentik 用户组名称]-[领域名称]`
- 若 Authentik 用户组名称为 `proxmox-admins`,领域名称为 `SSO`,那么该群组的名称为 `proxmox-admins-SSO`
**预配置权限**:
- 转至 数据中心 - 权限
- 点击 添加 - 群组权限
- 路径: `/`
- 群组: (上一步创建的群组)
- 角色: `Administrator`
- 继承: 是
### Vaultwarden
以下内容基本参照 [Enabling SSO support using OpenId Connect · dani-garcia/vaultwarden Wiki](https://github.com/dani-garcia/vaultwarden/wiki/Enabling-SSO-support-using-OpenId-Connect) 完成。
#### Authentik 配置
**配置提供程序**:
- 转至 应用程序 - 应用程序 - 以提供程序创建
- 协议设置:
- 重定向 URL/Origin:
- `严格` `https://vaultwarden.your.domain/identity/connect/oidc-signin`
- 高级协议设置:
- 已选作用域: `OpenID 'email'` `OpenID 'openid'` `OpenID 'profile'` `OpenID 'offline_access'`
#### Vaultwarden 配置
将以下内容添加进入 `docker-compose.yml` 文件 `vaultwarden` 服务的 `environment` 部分:
``` yaml title="docker-compose.yml"
environment:
SIGNUPS_ALLOWED: false # 不允许注册
SSO_ENABLED: true # 启用 SSO
SSO_ONLY: false # 仅采用 SSO 登录,不允许密码登录
SSO_SIGNUPS_MATCH_EMAIL: true # SSO 登录需匹配已有账户的邮箱
SSO_AUTHORITY: "xxx" # Authentik 中对应应用的提供程序的 OpenID 配置颁发者
SSO_SCOPES: "openid profile email offline_access"
SSO_CLIENT_ID: "xxx" # Authentik 中对应应用的提供程序的客户端 ID
SSO_CLIENT_SECRET: "xxx" # Authentik 中对应应用的提供程序的客户端 Secret
```
### Wallos
#### Authentik 配置
**配置提供程序**:
- 转至 应用程序 - 应用程序 - 以提供程序创建
- 协议设置:
- 重定向 URL/Origin:
- `严格` `https://wallos.your.domain`
#### Wallos 配置
- 转至 管理员 - OIDC 设置
- Enable OIDC/OAuth: 是
- Provider Name: (随意)
- Client ID: (Authentik 中对应应用的提供程序的客户端 ID)
- Client Secret: (Authentik 中对应应用的提供程序的客户端 Secret)
- Auth URL: (Authentik 中对应应用的提供程序的**授权 URL**)
- Token URL: (Authentik 中对应应用的提供程序的**令牌 URL**)
- User Info URL: (Authentik 中对应应用的提供程序的**用户信息 URL**)
- Redirect URL: `https://wallos.your.domain`
- Logout URL: (Authentik 中对应应用的提供程序的**注销 URL**)
- User Identifier Field: `sub`
- Scopes: `openid` `email` `profile`
- 当使用 OIDC 登录时自动创建用户/禁用密码登录: (依照实际情况)
## 参考/进一步阅读
- [Memos 对接 Authentik | 某科学的贝壳](https://blog.ning.moe/posts/authentik-OAuth2-memos/)
- [Using Authentik for Proxmox PVE 8 user and group mapping Inteller.net Site](https://www.inteller.net/notes/2025/04/27/using-authentik-for-proxmox-pve-8-user-and-group-mapping/)
- [Authentik 教程系列 - ECWU's Notebook](https://ecwuuuuu.com/post/authentik-tutorial-1-introduction-and-install/)
- [Gist - ECWU's Notebook](https://ecwuuuuu.com/series/gist/)
- [Authentik 教程系列 - 哔哩哔哩(UP:ecwuuu)](https://www.bilibili.com/video/BV1pm41167WK/)