当前位置:首页 > 技术文章 > 正文内容

Nginx 结合服务端实现下载文件鉴权

arlanguage4个月前 (01-06)技术文章53

背景

通过 URL 在浏览器下载文件时,并且要判断有权限的用户才能下载。

功能描述

浏览器输入下载 URL,吊起浏览器自带的用户名和密码输入框,将填入的用户信息传给服务端,校验通过下载文件,校验不通过重新输入。

实现思路

  1. 在 Nginx 中配置下载路径拦截
  2. 定义一个需要认证才能访问的文件下载路径设置 auth_request 向服务端转发请求,验证用户信息设置 alias 文件静态地址,若鉴权通过,下载文件

代码

Nginx 配置

nginx.config

conf

复制代码

location /auth { proxy_pass http://localhost:7001/auth/protected-check; # 向后端转发的鉴权请求 proxy_redirect off; proxy_set_header X-real-ip $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } # 需鉴权的文件下载 location /auth-download { auth_request /auth; alias /uploads/email/; # 绝对路径 autoindex on; sendfile on; sendfile_max_chunk 1m; tcp_nopush on; expires off; add_header Cache-Control private; }

服务端接口

这里用的是 egg.js 写的服务端

  1. app/router.js 中添加对应的鉴权路由
ts

复制代码

import { Application } from'egg';exportdefault (app: Application) => {const { controller, router } = app; router.get('auth/protected-check', controller.auth.protectedCheck);}

  1. 在对应的 Controller 中添加 protectedCheck 方法
  • 当服务器响应一个 HTTP 401 Unauthorized 状态码,并且在响应头请求响应头中包含WWW-Authenticate字段时,多数现代浏览器会自动弹出一个对话框要求用户输入用户名和密码
  • 最后,根据 Nginx 的配置,如果这个函数返回 200 状态码,Nginx 将认为鉴权已通过,并允许访问配置的文件目录进行下载。否则,Nginx将继续阻止访问,直到鉴权通过。

app/controller/auth.js

ts

复制代码

publicasyncdownloadCheck() {const { ctx } = this;const authHeader = ctx.request.header.authorization;if (!authHeader || !authHeader.startsWith('Basic ')) { ctx.status = 401; ctx.set('WWW-Authenticate', 'Basic realm="Restricted Area"');return; }const base64Credentials = authHeader.slice(6);const credentials = Buffer.from(base64Credentials, 'base64').toString('ascii');const [username, password] = credentials.split(':');// 这里你可以添加自己的验证逻辑,比如查询数据库if (username === 'admin' && password === 'password') { ctx.body = 'Access granted';// 当 status 为 200 时 Nginx 会判断鉴权通过,进而从配置的文件目录下载文件 ctx.status = 200; } else { ctx.status = 401; ctx.set('WWW-Authenticate', 'Basic realm="Restricted Area"'); } }

扫描二维码推送至手机访问。

版权声明:本文由AR编程网发布,如需转载请注明出处。

本文链接:http://www.arlanguage.com/post/632.html

分享给朋友:

“Nginx 结合服务端实现下载文件鉴权” 的相关文章

Nginx 解决error.log和access.log日志的改善总结

1. 介绍自从了解了error和access日志的重要性,并且学会阅读相关log文档之后。通过调整nginx配置,解决error中的大量报错提示。通过过滤js等静态资源减少大量的access日志记录内容。同时,经过使用阿里云安全组封禁大量国外ip地址的访问。我的access.log文件和error....

Nginx安装与调优部署文档(WinServer)

1. 安装环境准备1.1 部署规划软件安装路径 E:\nginx软件日志路径 E:\nginx\logs软件主配置文件路径 E:\nginx\conf软件子配置文件路径 E:\nginx\conf\conf.d软件站点配置路径 E:\nginx\html端口规划 802. Nginx安装部署2.1...

nginx配置集群 -websocket

nginx配置集群 -websocket前几天做一个nginx的反向代理,来代理websocket。因为上线时间的问题,所以是单节点运行。现在准备做集群优化,然后上容器环境。这样就需要配置nginx的负载均衡。不废话了,下面是配置文件。当然配置后需要验证,验证的时候会出现很多奇怪的问题。这里就不进行...

轻松搭建基于 Serverless 的 ThinkPHP 应用

ThinkPHP 是什么?ThinkPHP 是一个免费开源的,快速、简单的面向对象的轻量级 PHP 开发框架,是为了敏捷 WEB 应用开发和简化企业应用开发而诞生的。ThinkPHP 从诞生以来一直秉承简洁实用的设计原则,在保持出色的性能和至简代码的同时,更注重易用性。遵循 Apache2 开源许可...

nginx命令——学习记录 nginx详细教程

nginx命令--学习记录查看80端口是否被占用netstat -ntlpnginx命令#/usr/local/nginx/sbin/nginx 启动命令#/usr/local/nginx/sbin/nginx -t 检测配置文件 #/usr/local/nginx/sbin/ngin...

平稳运行半年的系统宕机了,记录一次排错调优的全过程

(一)前言最近发生了一件很让人头疼的事情,已经上线半年且平稳运行半年系统在年后早高峰的使用时发生了濒临宕机的情况。访问速度特别慢,后台查到大量time_wait的连接,从代码层面到架构层面到网络层面排查了几天几夜,总算是有了结果。(二)架构、问题描述先简单描述一下这个系统的架构,公网域名对应的公网I...