nginx做文件服务器时使用第三方系统做认证
我们在项目中做文件下载时,一般会使用nginx 做文件下载服务器,但是一旦暴露了 下载链接,其他人就随意下载文件,有安全风险。
其实我们可以使用Nginx的auth_request
模块,nginx 在接到下载请求时,将请求转发到我们自己的项目中,我们项目提供一个接口来做认证,认证通过返回nginx 200
,否则返回401
栗如:web 项目用户登录会产生一个token, 用户登录后在下载文件时,在请求头(header
)中加上Authorization
例如:
nginx 配置如下:
location /img/ {
auth_request /auth;
error_page 401 = @auth_required;
alias /data/img/;
image_filter_buffer 10M;
}
location = /auth {
proxy_pass http://127.0.0.1:8848/verity;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Authorization $http_authorization;
}
location @auth_required {
return 401; # 认证失败返回 401 状态码
}
注意: nginx 需要auth_required
模块,在安装时候执行
./configure --with-http_auth_request_module
在使用宝塔面板安装nginx 时,一定要选择编译安装,并记得添加此模块。
后端认证demo
示例为简单的flask 程序
from flask import Flask, request, abort
# 创建一个 Flask 应用实例
app = Flask(__name__)
@app.route('/')
def hello_world():
print(request.headers)
return 'Hello, World!'
@app.route('/verity')
def verity_func():
print(request.headers)
print(request.url)
if request.headers.get("Authorization")=='12366666':
return 'ok',200
else:
abort(401)
if __name__ == '__main__':
# 在开发模式下运行应用
app.run(host='0.0.0.0',port=8848, debug=True)
/verity 接口模拟解析Authorization认证的过程
测试:
curl --location --request GET 'http://124.70.71.86/img/3.jpg' \
--header 'Authorization: 12366666' \
--header 'User-Agent: Apifox/1.0.0 (https://www.apifox.cn)'
Authorization 的value 内容可以自定义,
此案例仅仅是一个思路,
比如我们在做文件分享时,比如分享文件有效期为7天,我们生成一个随机url,比如 http://www.demo.com/down/iZNuYBDkPI3N.py
我们在redis中将文件真实名字与iZNuYBDkPI3N.py
对应存储,这条数据在redis 设置过期时间为7天,用户每次下载都拿iZNuYBDkPI3N.py
这个名字来redis 找数据, 找不到则证明超过分享时间了。
沿着此思路可以拓展需要业务场景。
做个有理想有节操的程序员!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】