2017-07-14 119 views
1

我有一個後端,它生成三個JWT令牌 - 引用令牌,訪問令牌和刷新令牌。引用令牌存儲對訪問令牌的引用,訪問令牌用於訪問API,刷新令牌用於在訪問令牌超時時重新發出訪問令牌。問題是我不想將訪問令牌傳遞給客戶端,但希望使用nginx將其存儲在memcached中。所以,我的整個任務是過濾從後端,目前看起來那麼簡單響應:過濾器響應並使用nginx + Lua存儲memcached中的內容

{"reference_token":"...","access_token":"...","refresh_token":"..."} 

Nginx的應該過濾這種反應,從這個反應獲得訪問令牌並將其存儲在memcached的。最後,它應該返回給客戶一個新的迴應:

{"reference_token":"...","refresh_token":"..."} 

正如你所看到的,應該沒有access_token了。訪問令牌是我嘗試保護的內容,而不是顯示它,甚至將它傳遞給客戶端。我不知道的是,實現這一點的最佳方法是什麼,我應該使用哪個Lua塊來完成這項任務。我知道body_filter_by_lua,但文件不久說:

注意下面的API函數在這一範圍內,由於在NGINX輸出濾波器的當前實現

所以限制當前已禁用,好像身體過濾是相當有限的,我甚至不知道是否有可能在此塊內調用memcached API。那麼,我該如何在現實世界中執行我的任務?至少,我應該用什麼Lua(openresty)技巧來完成這項任務?

回答

1

例如,您可以在您的內容處理程序中向您的後端發出子請求(例如,ngx.location.capture)。 接下來,您可以根據需要過濾一個正文,然後使用lua-resty-memcached,它使用cosocket API。

這種方法的缺點是你會有完整的緩衝代理。

+0

謝謝,亞歷山大!您能否詳細解釋爲什麼全緩衝代理是一個缺點?我是nginx新手,不知道這些細微差別。 – Jacobian

+1

想象一下,上游服務器響應巨大的身體。通常它會發送一些塊。 Nginx處理每個塊,默認情況下將其發送回客戶端而不等待完整的響應主體。它節省了一些資源並且性能更高。採用全緩衝方式,您需要在某處保存標題/正文。如果將它保存在內存中,則可能會在高負載下進行交換。如果你把它保存在一個文件中 - 你會有IO開銷。 –