使用 nginx+Lua 过滤响应并在 memcached 中存储一些内容

Filter response and store something in memcached using nginx+Lua

我有一个生成三个 JWT 令牌的后端 - 引用令牌、访问令牌和刷新令牌。 Reference token 存储了对access token的引用,用于访问API,refresh token用于在超时时补发access token。问题是我不想将访问令牌传递给客户端,而是想使用 nginx 将其存储在 memcached 中。所以,我的整个任务是过滤来自后端的响应,目前看起来很简单:

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

Nginx 应该过滤这个响应,从这个响应中获取访问令牌并将它存储在 memcached 中。最后,它应该return给客户端一个新的响应:

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

如您所见,应该没有 access_token 了。访问令牌是我试图保护的东西,而不是显示它,甚至将它传递给客户端。我不知道什么是实现这个的最佳方法,我应该为这个任务使用什么 Lua 块。我知道 body_filter_by_lua ,但文档很快就说:

Note that the following API functions are currently disabled within this context due to the limitations in NGINX output filter's current implementation

因此,主体过滤似乎相当有限,我什至不确定是否可以在此块内调用 memcached API。那么,我怎样才能在现实世界中实现我的任务呢?至少,我应该使用什么 Lua (openresty) 技巧来完成这个任务?

例如,您可以在内容处理程序中向后端发出子请求(例如 ngx.location.capture)。 接下来,您可以根据需要过滤一个主体,然后使用 lua-resty-memcached,它使用 cosocket API.

这种方法的缺点是您将拥有完整的缓冲代理。