簡體   English   中英

如何使用Varnish緩存RESTful API,但仍然使用HMAC簽名/驗證每個請求?

[英]How to use Varnish to cache RESTful API, but still use HMAC for signing/verifying each request?

我有興趣使用Varnish緩存/限制/等響應我正在創建的RESTful API。 我可能過於松散地使用術語/首字母縮略詞“HMAC”,但我的意思是每個對我的API的請求都應該包含一個標題,該標題包含客戶端通過散列部分請求(包括時間戳)計算的哈希值共享秘密。 然后,服務器使用來自請求的相同成分計算此相同的散列,並確定請求是否有效並應響應。

這很好用,但現在我想使用Varnish來緩存我的API響應。 HMAC的性質要求每個請求計算哈希以驗證用戶是誰,但返回的實際響應是相同的 - 因此API調用的內容非常容易緩存。

我想要的(我假設這可以實現,我只是不知道如何)是將身份驗證任務傳遞給后端,以某種方式告訴Varnish“是的,繼續並響應此請求”或“不,不要回復此請求“然后從那里讓Varnish確定是否可以從緩存中提供請求。

更理想的情況是,做一些稍微更美好的事情,並允許Varnish自己處理身份驗證,或者將HMAC處理傳遞給比后端更快的東西。 例如,API可能將客戶端密鑰/公鑰存儲在redis緩存中,然后Varnish可能實際使用Redis中的值計算哈希本身。

您應該能夠使用兩個清漆模塊在Varnish VCL代碼(清漆配置語言)中實現更高級的解決方案:

這兩個模塊都在生產中使用,如模塊目錄中所列。

如果Varnish在VCL中處理身份驗證,您可以讓Varnish緩存您的API后端響應,並僅為經過身份驗證的請求提供響應。

如果HMAC實現需要請求正文:

正如Gridfire在他/她的回答中指出的那樣 ,Varnish無法訪問請求正文。 我們可以/不應該從后端/應用程序的HTTP頭中發送完整的請求主體。

但是,我們可以在HTTP標頭中發送完整請求正文的散列/摘要。 與生成輸出(標記|數據|無論什么)相比,后端的散列計算應該可以忽略不計。 AFAICT只要哈希/摘要和HMAC是健壯的,並且摘要很長(256位或更多),那么該方法應該沒有密碼/實際缺點。 通常會對性能測試提出建議。

除非您的HMAC實現使用請求主體作為哈希的一部分,否則Varnish可以使用Geir Bostad答案中的VMOD輕松地進行HMAC。 Varnish不允許您訪問請求體, libvmod-bodyaccess提供了一些功能,但我發現無法實際獲取請求體。

理論上你可以添加一個包含請求體的標頭,但這是非常糟糕的做法,如果您選擇僅將數據放入標頭中,則會使用冗余數據膨脹您的HTTP請求,或者破壞HTTP請求標准。 簡單地說不推薦。

另一種解決方案是使用Nginx,如果你想使用HTTPS(Varnish不做SSL),它也可以作為SSL終止符。 Nginx有一個運行Lua腳本的模塊 (Ubuntu / Debian包nginx-extras提供它而不需要你自己編譯),模塊帶來了方便的access_by_lua_file指令,允許或阻止訪問基於腳本的結果。 有一個HMAC腳本Nginx的位置

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM