为NAS/服务器补上认证缺口:Tinyauth快速实现外网登录保护

其实最近发了篇但是黑盒这边不让过哈哈~已经明白啥是高压线了,之前的Lucky教程也是

感兴趣的可以去我的BLOG玩~

之前介绍过非常多的Docker应用,有的应用会自带一个前端认证。用NAS举例,本身的WEB自带登陆认证,还支持配置两步验证到WEB各种应用服务。再比如QB、TR、EMBY这些常见Docker服务都内置了登陆验证,但很多轻量级的工具类服务可能并没有(IT- tools等),别人知道你的服务域名后就能直接白嫖。

本期咱们就来介绍一款中间认证服务:Tinyauth,用于保护我们的应用服务。大家看看动图演示应该就能了解效果~

Tinyauth 正在积极开发中,配置可能会经常更改。更新前请务必仔细阅读发行说明。

如果只是个人使用,像Lucky.CADDY 等自带的 BasicAuth 其实已经非常方便。

因为Lucky自带认证,并且Tinyauth官方文档明确对于NPM有很好的支持,所以就承接上一篇文章,我们基于NPM进行改造。

Lucky的认证如下图所示。大家如果觉得够用则无需部署Tinyauth。

Tinyauth 简介

Tinyauth 是一个由 Go 语言开发的 轻量级身份认证中间件,主要用于在自托管或容器化环境中为 Web 应用快速增加访问控制功能。它不需要修改原有应用,只需通过反代(如 Traefik、Nginx、Caddy)接入,就能实现登录保护。

✨ 主要特点

  • 轻量简洁:单个二进制文件即可运行,无额外依赖,资源占用极低。

  • 即开即用:配置简单,常见场景只需设置环境变量即可完成部署。

  • 多种认证方式:支持用户名密码认证,也支持 OAuth 登录(如 Google、GitHub)。

  • 反代友好:可与 Traefik、Nginx、Caddy 等无缝集成,适合 Homelab 和企业小型应用。

  • Cookie 统一认证:基于域名设置 Cookie,实现同一主域下多个应用的单点登录。

🔧 应用场景

  • 给 个人 NAS 服务(如 QNAP)增加外网访问保护。

  • 保护 内部工具(如 Portainer、Grafana、Whoami 等)。

  • 在 家庭实验室 或 小团队项目 中快速加一层身份验证,而无需搭建复杂的 OAuth 服务。

准备工作

我们需要准备生成用户名/密码哈希以及32字节随机密钥。

SSH工具连接NAS,依次输入以下命令。将生成的内容复制备用。可参考图片。

# 交互生成用户名/密码哈希(整行复制)

docker run -it --rm ghcr.io/steveiliop56/tinyauth:v3 user create --interactive

# 输入用户名和密码每一步都要回车,最后移动键盘方向键,选择yes再回车一次即可

# 我设置的账户/密码为 ydxian/qnap1234

# 生成32字节随机密钥(整串复制),试过64会报错

openssl rand -hex 16

部署流程

先创建一个专用网络,方便需要反代的应用与NPM连通。

docker network create npm-net

查阅官方文档后,我给出的推荐代码如下:

services:

   app:

      image: jc21/nginx-proxy-manager:latest

      container_name: npm

      restart: always

      environment:

         TZ: Asia/Shanghai

         DISABLE_IPV6: "true"

      volumes:

         - /share/Container/npm/data:/data

         - /share/Container/npm/letsencrypt:/etc/letsencrypt

      ports:

         - "81:81" # NPM面板(仅内网)

         - "8442:80" # 公网HTTP(非常用端口)

         - "8443:443" # 公网HTTPS(非常用端口)

      networks:

         - npm-net

   tinyauth:

      image: ghcr.io/steveiliop56/tinyauth:v3

      container_name: tinyauth

      restart: always

      environment:

         - APP_URL=https://auth.xxx.xyz:8443 # 走NPM的8443

         - USERS=ydxian:$$2a$$10$$9Yc/rH90cPJEJjemF6oRmu9tbnClFyDhjSSjlRyJFPstuFqxr45Ky

         - SECRET=597c4353178836b87f78c5588fc6fc60

      networks:

         - npm-net

      ports:

         - "5202:3000"

networks:

   npm-net:

      external: true

需要注意的是,咱们国内用非标准端口号,APP_URL也要进行补齐。

将上面代码改写后,打开Container Station 创建新的应用程序。

成功的日志参考。

反代HTTPS

这步是必要的~

打开NPM,我们要为Tinyauth操作。如下图填写相关信息后保存。要注意别勾选Block Common Exploits,如果启用,将不允许在查询参数中使用 URL,而这正是 Tinyauth 正常运行所必需的。

再次对这条进行编辑。因为上一篇我们申请了泛域名证书,这次就方便很多~保存即可。

接着浏览器输入域名+8443就能访问Tinyauth。

为应用添加验证

我的主NAS中部署了IT-Tools万能工具箱,这个服务是不带登录认证的,咱们就拿它来演示。

为了方便容器互通,部署代码:

services:

   it-tools:

      image: ghcr.io/corentinth/it-tools:latest

      container_name: it-tools

      ports:

         - "8864:80" # 可留作本地直连排错;不是必须

      networks:

         - npm-net

      restart: always

networks:

   npm-net:

      external: true

重复上面步骤,为该服务做好反代。然后对其进行编辑,将下面的内容修改后粘贴进框内并保存。需要修改的位置已用中文标注。修改完后建议将注释都删除。

# Root location

location / {

# Pass the request to the app

  proxy_pass          $forward_scheme://$server:$port;

  # Add other app specific config here

  # Tinyauth auth request

  auth_request /tinyauth;

  error_page 401 = @tinyauth_login;

}

# Tinyauth auth request

location /tinyauth {

  # Pass request to Tinyauth

  proxy_pass http://tinyauth:3000/api/auth/nginx;

  # Pass the request headers

  proxy_set_header x-forwarded-proto $scheme;

  proxy_set_header x-forwarded-host $http_host;

  proxy_set_header x-forwarded-uri $request_uri;

}

# Tinyauth login redirect

# 下面这个域名改成你自己的Tinyauth服务

location @tinyauth_login {

  return 302 https://auth.xxx.xyz:8443/login?redirect_uri=$scheme://$http_host$request_uri; }

换到最后一栏,我们将参数编辑后粘贴进框内后保存。

浏览器输入域名访问工具箱。

我从Chrome换成了Safari,因为缓存问题。其实新开个无痕也能验证。会自动跳转到验证界面,速度大家不用担心,很快~丝滑~

输入上文SSH设置的账户密码,不要输入哈希值啊~回车登录~如下图所示,点击继续。

然后就成功进入应用咯。

更多游戏资讯请关注:电玩帮游戏资讯专区

电玩帮图文攻略 www.vgover.com