返回首页
最新
我目前正在进行一个较大的项目,需要一个基于短期 HTTP "认证" 的解决方案,该认证依赖于一个独立的身份验证过程。由于每个被允许的 IP 仅需在特定服务器名称上允许几分钟,因此我创建了这个项目来解决这个问题。它应该可以与任何兼容 Redis 的数据库一起使用。在 docker-compose 示例中,我使用了 valkey。
如果您有多个域名需要控制访问,这个项目特别有用。例如,如果您想允许 IP 地址 1.1.1.1 访问 mywebsite.com 和 securesite.com,以及 2.2.2.2 访问 securesite.com 和 anothersite.org,您只需在您选择的兼容 Redis 的数据库中设置哈希键,如下所示:
1.1.1.1:
```
- mywebsite.com: 1 (30 秒 TTL)
- securesite.com: 1 (15 秒 TTL)
```
2.2.2.2:
```
- securesite.com: 1 (3600 秒 TTL)
- anothersite.org: 1 (永不过期)
```
由于您可以使用任何兼容 Redis 的数据库作为后端,因此建议为每个条目设置 TTL。
还可以使用进程内缓存,但除非您向 kvauth 传递 --enable-l1-cache,否则该功能不会启用。这样可以大大加快成功的认证请求的速度,因为程序不会在每个请求时都访问键值数据库。
我没有对这个进行深入的性能分析,但启用了 chi 日志中间件,以查看请求通常需要多长时间:
```
kvauth-1 | 2025/12/30 21:32:28 "GET http://127.0.0.1:8888/kvauth HTTP/1.0" from 127.0.0.1:42038 - 401 0B in 300.462µs # 不允许的请求
nginx-1 | 192.168.65.1 - - [30/Dec/2025:21:32:28 +0000] "GET / HTTP/1.1" 401 179 "-" "curl/8.7.1"
kvauth-1 | 2025/12/30 21:32:37 "GET http://127.0.0.1:8888/kvauth HTTP/1.0" from 127.0.0.1:40160 - 401 0B in 226.189µs # 不允许的请求
nginx-1 | 192.168.65.1 - - [30/Dec/2025:21:32:37 +0000] "GET / HTTP/1.1" 401 179 "-" "curl/8.7.1"
# IP 已添加到 Redis 允许列表
kvauth-1 | 2025/12/30 21:34:02 "GET http://127.0.0.1:8888/kvauth HTTP/1.0" from 127.0.0.1:54032 - 200 0B in 290.648µs # 允许,但需要访问 valkey
kvauth-1 | 2025/12/30 21:34:02 "GET http://127.0.0.1:8888/kvauth HTTP/1.0" from 127.0.0.1:54044 - 200 0B in 4.041µs
nginx-1 | 192.168.65.1 - - [30/Dec/2025:21:34:02 +0000] "GET / HTTP/1.1" 200 111 "-" "curl/8.7.1"
kvauth-1 | 2025/12/30 21:34:06 "GET http://127.0.0.1:8888/kvauth HTTP/1.0" from 127.0.0.1:51494 - 200 0B in 6.617µs # 允许,使用了缓存
kvauth-1 | 2025/12/30 21:34:06 "GET http://127.0.0.1:8888/kvauth HTTP/1.0" from 127.0.0.1:51496 - 200 0B in 3.313µs
nginx-1 | 192.168.65.1 - - [30/Dec/2025:21:34:06 +0000] "GET / HTTP/1.1" 200 111 "-" "curl/8.7.1"
```
IP 允许列表并不是真正的身份验证,任何该项目的生产实现都应该将其作为认证流程的一部分。这是为了解决 NGINX 动态 IP 允许列表的特定问题而创建的。