nginx做文件服务器时使用第三方系统做认证

我们在项目中做文件下载时,一般会使用nginx 做文件下载服务器,但是一旦暴露了 下载链接,其他人就随意下载文件,有安全风险。

其实我们可以使用Nginx的auth_request模块,nginx 在接到下载请求时,将请求转发到我们自己的项目中,我们项目提供一个接口来做认证,认证通过返回nginx 200,否则返回401

栗如:web 项目用户登录会产生一个token, 用户登录后在下载文件时,在请求头(header)中加上Authorization

例如:

nginx 配置如下:

ini 复制代码
      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 模块,在安装时候执行

bash 复制代码
./configure --with-http_auth_request_module

在使用宝塔面板安装nginx 时,一定要选择编译安装,并记得添加此模块。

后端认证demo

示例为简单的flask 程序

python 复制代码
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认证的过程

测试:

rust 复制代码
curl --location --request GET 'http://124.70.71.86/img/3.jpg?token=111111' \
--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 找数据, 找不到则证明超过分享时间了。

仅供参考。

相关推荐
SomeB1oody21 分钟前
【RustyML入门】7.4. 按需裁剪与模块化集成
开发语言·后端·机器学习·rust·教程
罗超驿24 分钟前
SpringBoot 快速入门
java·spring boot·后端
卷无止境1 小时前
除了开发api,FastAPI其实也可以配合jinja2模板写页面
后端·python·fastapi
newerp1 小时前
Redis 操作与缓存策略
后端·程序员·go
newerp1 小时前
GORM ORM 基础
后端·程序员·go
小岛前端1 小时前
AI Skills 已经封神,但新的问题却越来越严重!
前端·后端·github
拖孩1 小时前
一个人 + AI 做的小程序,上线 15 天赚了 10 块 5
前端·后端·微信小程序
newerp1 小时前
CRUD 操作与预处理语句
后端·程序员·go
wei_shuo2 小时前
KES 数据同步与ETL实战:数据集成、转换与实时同步方案
后端
乒乓狂魔14786739970002 小时前
LangGraph:用一张图,编排一群 AI 助手
后端