Outline使用Authelia实现本地认证

在 『 基于Outline构建团队的知识库(上篇) 』 一文中老苏介绍过 Outline 需要借助于第三方认证,同时老苏也关注到 Authelia 支持 OIDC 认证,虽然 Authelia 官方强调还是 β版 ,但老苏还是觉得应该试试,毕竟如果成功了就可以让 Outline 实现真正意义上的本地化部署了

【重要提示】:

老苏只是记录安装方法和过程,不对你的数据负任何责任😳

  1. 如果你是第一次安装,请先看看 OutlineAuthelia 的安装,会有助于理解本文,因为有👇这些铺垫,所以只对新增的内容做了简要的描述

    • 基于Outline构建团队的知识库 (上篇)
    • 基于Outline构建团队的知识库 (下篇)
    • 单点登录服务Authelia(上篇)
    • 单点登录服务Authelia(下篇)
  2. authelia 不支持在非标准端口上运行,表现为存在截掉端口的现象,按作者的说法,可能要等到 v4.34 才会修复,所以很多步骤需要自己手动添加端口,如果你是备案了的域名,就不存在这样的烦恼

  3. 登录成功再 logout 之后,只会显示上次登录成功的方式,所以如果你之前实践过 slack 登录,就算你按照本文操作成功,登录界面也是看不到的,老苏解决的办法简单粗暴,直接删空 data 目录,如果你已经有笔记数据了请慎重!慎重!慎重!一定要三思而后行

什么是 OpenID Connect(OIDC)?

OpenID Connect 1.0OAuth 2.0 协议之上的简单身份层。它允许客户端根据授权服务器执行的身份验证验证最终用户的身份,并以可互操作和类似 REST 的方式获取有关最终用户的基本配置文件信息。

OpenID Connect 允许所有类型的客户端(包括基于 Web、移动和 JavaScript 的客户端)请求和接收有关经过身份验证的会话和最终用户的信息。该规范套件是可扩展的,允许参与者在对他们有意义的情况下使用可选功能,例如身份数据加密、OpenID 提供者发现和会话管理。

老苏的把本文用到的文件都放在了这里👉: https://github.com/wbsu2003/synology/tree/main/outline(OIDC)

设置 Authelia

Authelia 官方在 https://www.authelia.com/docs/configuration/identity-providers/oidc.htmlOIDC 身份提供者提供了一个示例配置,同时也详细解释了每个字段

在原来的 Authelia 的配置文件 configuration.yml 尾部增加了 identity_providers,这里只对需要修改处做简单的说明

  • hmac_secret
1
hmac_secret: this_is_a_secret_abc123abc123abc

hmac_secret 是用于签署 OpenID Connect JWTHMAC 密钥。为了满足所需的格式,提供的字符串被散列为 SHA256 字节字符串。您必须自己生成此选项。

官方推荐用👇下面的代码来生成

1
2
LENGTH=64
tr -cd '[:alnum:]' < /dev/urandom | fold -w "${LENGTH}" | head -n 1 | tr -d '\n' ; echo

也可以用之前老苏用过的 openssl rand -hex 32

如果命令行都不想用,就用 bitwarden 的密码生成器吧

  • issuer_private_key

采用 DER base64 编码的 PEM 格式的私钥,用于加密 OpenID Connect JWT

第一步、需要在 authelia 中建一个子目录 keys

第二步、停止 authelia 容器,右键 编辑 –> 存储空间 –> 添加文件夹

第三步、启动 authelia 容器,并进入终端机

执行下面👇的命令

1
2
# 生成秘钥
authelia rsa generate --dir /keys

如果你更喜欢命令行,也可以直接在 SSH 客户端中运行

1
2
3
4
5
# 进入容器
docker exec --user root -it <容器名称> /bin/sh

# 生成秘钥
authelia rsa generate --dir /keys

File Station 中能看到生成的公钥和私钥文件

key.pem 重命名为 key.pem.txt 后,可以直接打开复制

复制完成后,记得把文件名改回去

所以最后应该是这个样子的

1
2
3
4
issuer_private_key: |
-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKC...
-----END RSA PRIVATE KEY-----
  • clients
1
2
3
4
  clients:
- id: outline
description: Outline Wiki
secret: 856d53b8eb53c6d4e30194a2

此客户端的客户端 ID。它必须与使用此客户端的应用程序中配置的客户端 ID 完全匹配。

因为是配置给 outline 用的,所以 id 用了 outline,后面在环境变量文件中还会用到

  • redirect_uris
1
2
redirect_uris:
- https://ot.laosu.ml:444/auth/oidc.callback

此客户端将重定向到的有效回调 URI 列表。所有其他回调将被视为不安全。URI 区分大小写,outlineOIDC 回调地址是 https://<URL>/auth/oidc.callback

<URL> 替换为域名 https://ot.laosu.ml:444/auth/oidc.callback

如果没备案,有端口也要带上

以上工作完成,记得重启容器

设置 Outline

修改 docker.env.txt

  1. 通用参数部分

老苏增加了几行,用于 OIDC 的设置

1
2
3
YOUR_OIDC_CLIENT_ID=outline
YOUR_OIDC_CLIENT_SECRET=856d53b8eb53c6d4e30194a2
AUTHELIA_URL=https://auth.laosu.ml:444

这里的 YOUR_OIDC_CLIENT_ID 对应前面设置的 configuration.ymlclientsidYOUR_OIDC_CLIENT_SECRET 对应 clientssecret

AUTHELIA_URL 是指 Authelia 的域名

  1. AUTHENTICATION 部分

docker.env.txt 中已经预留了 OIDC 的认证,但相关内容原来后面的空的,需要补填

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# To configure generic OIDC auth, you'll need some kind of identity provider.
# See documentation for whichever IdP you use to acquire the following info:
# Redirect URI is https://<URL>/auth/oidc.callback
OIDC_CLIENT_ID=${YOUR_OIDC_CLIENT_ID}
OIDC_CLIENT_SECRET=${YOUR_OIDC_CLIENT_SECRET}
OIDC_AUTH_URI=${AUTHELIA_URL}/api/oidc/authorize
OIDC_TOKEN_URI=${AUTHELIA_URL}/api/oidc/token
OIDC_USERINFO_URI=${AUTHELIA_URL}/api/oidc/userinfo

# Specify which claims to derive user information from
# Supports any valid JSON path with the JWT payload
OIDC_USERNAME_CLAIM=preferred_username

# Display name for OIDC authentication
OIDC_DISPLAY_NAME=Authelia

# Space separated auth scopes.
OIDC_SCOPES="openid profile email"

OIDC_DISPLAY_NAME 是显示的名称

修改 docker-compose.yml

docker-compose.ymloutline 的环境变量部分增加下面的内容

1
2
3
4
5
6
7
8
- OIDC_CLIENT_ID=${OIDC_CLIENT_ID}
- OIDC_CLIENT_SECRET=${OIDC_CLIENT_SECRET}
- OIDC_AUTH_URI=${OIDC_AUTH_URI}
- OIDC_TOKEN_URI=${OIDC_TOKEN_URI}
- OIDC_USERINFO_URI=${OIDC_USERINFO_URI}
- OIDC_USERNAME_CLAIM=${OIDC_USERNAME_CLAIM}
- OIDC_DISPLAY_NAME=${OIDC_DISPLAY_NAME}
- OIDC_SCOPES=${OIDC_SCOPES}

同时注释掉了原来的 slack,不注释也可以,但是你用 OIDC 登陆成功一次后,slack 也就不再显示了

为了演示,老苏把三种认证方式都打开了

运行

SSH 客户端执行下面的命令

如果你是第一次安装,不需要执行 一键删除一键删除 并不会删除数据,删除 outline 中的子文件夹才会

1
2
3
4
5
6
7
8
# 进入 outline 目录
cd /volume2/docker/outline

# 一键删除
docker-compose --env-file docker.env.txt down

# 一键运行
docker-compose --env-file docker.env.txt up -d

在浏览器中打开 https://ot.laosu.ml:444

选择 使用 Authelia 继续,浏览器中地址会变成 https://auth.laosu.ml/,并显示 无法访问此网站

如果你是没备案的域名,需手动添加端口,老苏的是 444,加好后直接回车

因为前面设置了 two_factor,还需要输入 OTP 密码,如果是是 one_factor 就直接跳到下个界面了

认证完成后地址栏会变成 https://auth.laosu.ml/consent,需再次动添加端口 444,然后回车

点蓝色的 ACCEPT 按钮后,会再次显示 无法访问此网站,需第三次添加端口,然后回车,就能看到主界面了

只要你不 退出登录,下次打开是可以直接进入到主界面的,但只要你退出了,其他的登录方式就消失了

参考文档

OpenID Connect | OpenID
地址:https://openid.net/connect/

OpenID Connect - Authelia
地址:https://www.authelia.com/docs/configuration/identity-providers/oidc.html

Guide for installing Outline with Authelia as an OpenID provider | by Rigaut-Luczak Lola | Medium
地址:https://medium.com/@Lola_Dam/guide-for-installing-outline-with-authelia-as-an-openid-provider-129a141f6090

Deploying Outline Wiki :: Guru Computing Blog
地址:https://blog.gurucomputing.com.au/doing-more-with-docker/deploying-outline-wiki/