2作者: dayt0n大约 1 个月前原帖
我目前正在进行一个较大的项目,需要一个基于短期 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 允许列表的特定问题而创建的。