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 找数据, 找不到则证明超过分享时间了。

仅供参考。

相关推荐
Victor3561 天前
https://editor.csdn.net/md/?articleId=139321571&spm=1011.2415.3001.9698
后端
Victor3561 天前
Hibernate(89)如何在压力测试中使用Hibernate?
后端
灰子学技术1 天前
go response.Body.close()导致连接异常处理
开发语言·后端·golang
Gogo8161 天前
BigInt 与 Number 的爱恨情仇,为何大佬都劝你“能用 Number 就别用 BigInt”?
后端
fuquxiaoguang1 天前
深入浅出:使用MDC构建SpringBoot全链路请求追踪系统
java·spring boot·后端·调用链分析
毕设源码_廖学姐1 天前
计算机毕业设计springboot招聘系统网站 基于SpringBoot的在线人才对接平台 SpringBoot驱动的智能求职与招聘服务网
spring boot·后端·课程设计
野犬寒鸦1 天前
从零起步学习并发编程 || 第六章:ReentrantLock与synchronized 的辨析及运用
java·服务器·数据库·后端·学习·算法
逍遥德1 天前
如何学编程之01.理论篇.如何通过阅读代码来提高自己的编程能力?
前端·后端·程序人生·重构·软件构建·代码规范
MX_93591 天前
Spring的bean工厂后处理器和Bean后处理器
java·后端·spring
程序员泠零澪回家种桔子1 天前
Spring AI框架全方位详解
java·人工智能·后端·spring·ai·架构