This commit is contained in:
698
docs/tech/Build-Your-Own-SSO.md
Normal file
698
docs/tech/Build-Your-Own-SSO.md
Normal file
@@ -0,0 +1,698 @@
|
||||
# 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/)
|
||||
Reference in New Issue
Block a user