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

时间:2017-07-14 15:39:38

标签: nginx lua openresty

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

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

Nginx应该过滤此响应,从此响应中获取访问令牌并将其存储在memcached中。最后,它应该向客户返回一个新的响应:

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

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

  

请注意,由于NGINX输出过滤器当前实现的限制,目前在此上下文中禁用了以下API函数

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

1 个答案:

答案 0 :(得分:1)

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

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