
大家好,我是真境,欢迎阅读本篇文章。
今天是给大家带来的是一个Web项目 —— Authelia
一、前言
前几天在部署一个 图片生成的项目(我不知道能不能说,我博客备案了)。刚开始我是在本地上用,后面有一个朋友也要用,所以我打算将这个项目搭建在服务器上来供他使用。但是!我发现一个严重的问题 —— 这个项目是没有鉴权页面的,也就是说任何人只要有我的服务器地址,就可以随便刷我的 Token 来生成图片,那问题可大了!
那这时候我就想了几个方案:
- 直接用 Nginx 自带的鉴权,但是我觉得太土了(就是浏览器 alert 那个风格)
- 搭建一个专属隧道,但是太麻烦了!因为我们都要下载一个客户端来登陆这个隧道(PS:我博客有一个Easytier的教程 可以看看)
于是我就在想,有没有一个项目他是一个独立的Web页面,并且他可以和 Nginx 进行联动来完成登陆呢…?于是我问了下美国豆包,给我推荐了一个叫 Authelia。于是这个文章就出来啦…
二、项目&思路
这是项目的官网,欢迎大家来看看:
实现我的图片生成项目的鉴权思路如下:
访问者 -> 图片生成.com -> Nginx跳转到Authelia -> Authelia判断是否登陆 -> (是) -> 进入 图片生成.com
|
|_>(否) -> 要求你登陆本教程所需要准备的东西为:
- 图片生成.com
- 登陆页面.com(啊 本教程只是作个示例,肯定可以用子域名的啦)
- 一台服务器
登陆页面你也可以用指定路径(如:图片生成.com/auth)来完成,我专门设置一个子域名是因为看着高级呀
这就是我们具体的实现过程,接下来就开始搭建吧
三、开始部署项目
既然这个项目支持 Docker,那我肯定直接 Docker部署啦。
1、部署 Authelia
安装 Docker(一键部署):
curl -fsSL https://get.docker.com | bash创建生成一个 Docker Compose 文件,这是文件内容:
services:
authelia:
image: authelia/authelia:latest
container_name: authelia
restart: unless-stopped
volumes:
- /home/docker/authelia/config:/config # 写你实际的 config 的配置文件路径
ports:
# 这边我设置了仅限本地才能登陆,大家根据自己情况来做决定
# 如果需要外网可以访问,请去掉 127.0.0.1:
- "127.0.0.1:9091:9091"
environment:
- TZ=Asia/Shanghai将其保存为 docker-compose.yml ,先不着急直接 compose up -d,我们先生成项目所需要的配置文件。
1️⃣生成用户密码的 Hash
顾名思义就是生成你密码的Hash值:
docker run --rm authelia/authelia:latest authelia crypto hash generate argon2 --password "你的密码"完成命令后会生成类似 $argon2id$v=19$m=65536,t=3,p=4$… 的字符串,保存起来先
2️⃣生成配置所需要的JWT和会话密钥
输入以下命令,生成 64 位的安全随机字符串,一共要生成 3 个:
docker run --rm authelia/authelia:latest authelia crypto rand --length 64 --charset alphanumeric一样的,保存备用
3️⃣生成 config 文件夹
项目文件目录的结构为:
Authelia/
├── config /
│ ├── users_database.yml
│ └── configuration.yml
└── docker-compose.yml按照以上的文件结构来创建好文件,首先我们先配置 configuration.yml:
server:
address: "tcp://0.0.0.0:9091" # 项目链接和端口 记得和 compose 的对应上!
log:
level: info
identity_validation:
reset_password:
jwt_secret: "第一个64位安全随机字符串"
authentication_backend:
file:
path: /config/users_database.yml
access_control:
default_policy: deny
rules:
- domain: "canvas.ntfs.uk"
policy: one_factor
session:
name: authelia_session
secret: "第二个64位安全随机字符串"
expiration: 1h
inactivity: 5m
cookies:
- domain: "" # 根域名,比如说 baidu.com
authelia_url: "https://登陆页面.com" # 填入你的登陆页面 URL,我写的是子域名
default_redirection_url: "https://图片生成.com" # 填入重定向的链接即你登陆完成跳转的页面
storage:
encryption_key: "第三个64位安全随机字符串"
local:
path: /config/db.sqlite3
notifier:
filesystem:
filename: /config/notification.txt其次我们再来配置users_database.yml:
users:
admin:
displayname: "管理员"
password: "$argon" # 完整填写刚刚生成的 Hash 密码
email: [email protected]
groups:
- admins
你也可以多配置你朋友的,不过本教程就教你最简单的搭建方式。还没这么进阶(
users:
admin:
displayname: "管理员"
password: "$argon2id$v=19$m=65536,t=3,p=4$..."
email: [email protected]
groups:
- admins
friend:
displayname: "朋友账号"
password: "$argon2id$v=19$m=65536,t=3,p=4$..." # 朋友的密码 Hash
email: [email protected]
groups:
- users4️⃣启动项目
配置完配置文件,保存之后直接启动 Authelia:
docker compose up -d如果有问题可以查看日志:
docker compose logs2、配置 Nginx 的内容
相信大伙都玩过 Nginx 了,我直接贴一个我自己的 Nginx 配置文件吧:
upstream 图片生成 {
server 127.0.0.1:3200; # 图片生成的内网地址
keepalive 64;
}
upstream authelia {
server 127.0.0.1:9091; # 登陆页面的内网地址
}
# 1. 登录门户服务
server {
listen 443 ssl;
http2 on;
server_name 登陆页面.com;
# 这个部分是针对登陆页面的证书配置内容
location / {
proxy_pass http://authelia;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
# 2. 强制 HTTP 重定向
server {
listen 80;
server_name 图片生成.com 登陆页面.com;
location / {
return 301 https://$host$request_uri;
}
}
# 3. 图片生成 主站配置(受保护)
server {
listen 443 ssl;
http2 on;
server_name 图片生成.com;
# 这边的内容 包括证书内容全部省略
# 根据需要受保护页面的配置内容来进行配置
# 请勿盲目替换
}
# === 主站反代与保护 ===
location / {
# 启用鉴权
auth_request /authelia;
auth_request_set $target_url $scheme://$http_host$request_uri;
# 未登录时自动跳转到漂亮的登录网页
error_page 401 =302 https://auth.ntfs.uk/?rd=$target_url;
# 鉴权通过后的常规反代
proxy_pass http://图片生成;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# WebSocket 支持
# 这个也要根据自己的网站配置来进行设置,别玩挂了
}
}
完事之后记得测试 Nginx 文件的可用性:
nginx -t测试成功后直接重启 Nginx
nginx -s reload四、新增 Cloudflare 的安全验证(可选)
因为我的验证方式及其简单:只用了账号密码登录,那我需要添加一个人机验证来防止被爆破。
不过 authelia 似乎不支持 Cloudflare自带的 Trunstile,但是可以直接使用 WAF 来进行托管质询,进入 Cloudflare页面:

点击右上角的“创建规则” – “自定义规则”

按照图片上的内容进行配置:

然后选择“采取措施”为“托管质询”

完事之后直接部署即可,访问页面试试看是否部署成功

到这里,我们本篇文章的内容就到这结束了,感谢大家的阅读!
希望本文章能给你起到帮助!我是真境,我们下篇文章见



deepseek的那个harness也没有鉴权或者登录页面,这么说也可以使用这个了
![image]()
查看图片
还真的是,dsh的API鉴权确实有点草率了
还真的是,dsh的API鉴权确实有点草率了