nginx 請求文件 進行用戶認證/鑒權: internal(限制為內部調用)


  在進行WEB開發時, 必然會遇到向用戶返回文件的場景(如圖片, 文檔等等), 當返回的文件較小時, 我們可以直接通過接口以數據流的形式向前台返回, 因為文件較小, 因此也不會太過於影響響應速度及服務器性能, 但是當文件較大時, 再使用接口中返回數據流的方式就顯得極其不合適了. 此時, 就需要通過 nginx 讀取文件資源向用戶進行返回.

  但是, 如果當用戶進行文件請求時, 我們需要對用戶進行身份認證(如視頻VIP會員, 文檔保密需求, 圖片防盜用等等), 這時我們就需要對 nginx 進行配置, 限制任意用戶進行訪問目標文件, 將其設置僅限內部調用.

  當用戶發起文件請求:

        第一步, 先將用戶的請求導向web應用層, 並進行用戶身份的認證

        第二步, 認證通過, 在web應用層發起內部調用, 由nginx返回文件, 否則返回 403

一.nginx 配置

  在 location 中加入 "internal", 聲明僅限內部調用

location /nodeOne/auth/ {
  internal; root
/var/resource/media/; }

二.web應用層進行用戶認證, 並發起內部調用: 以 python django 為例

"""具體的用戶認證流程須根據具體需求進行開發, 這里不列出"""

resp = HttpResponse()

file_name = path[path.rfind("/") + 1:]

# 其他響應頭根據需求進行添加, 但是 X-Accel-Redirect 這個響應頭必須設置, 它的值就是文件的url, 也就是需要和 nginx 中 location 相匹配. 其實就是聲明將本次請求進行一次內部調用的重定向
resp['X-Accel-Redirect'] = "/nodeOne/auth/" + file_name

resp["Content-Disposition"] = "attachment; filename={}; md5_token={}".format(parse.quote(file_name), query_set[0].file_md5)
resp['Content-Type'] = 'application/{}'.format(path[path.rfind(".")+1:])
resp["Content-Length"] = query_set[0].file_size * 1024
return resp

  需要注意的是, 當向用戶返回文件的url時, 並不應該直接返回真實的文件url, 因為nginx中設置了僅限內部調用, 如果由外部直接發起文件請求, 將得到 nginx 返回的 404 響應,  所以返回給用戶的url, 應該是進行用戶認證的接口, 至於如何攜帶參數, 用以判斷用戶請求的是哪個文件資源, 就需要開發者自行斟酌了.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM