2017-07-14 7 views
1

私は3つのJWTトークン(参照トークン、アクセストークン、リフレッシュトークン)を生成するバックエンドを持っています。参照トークンは、APIへのアクセスに使用されるアクセストークンへの参照を格納し、リフレッシュトークンは、タイムアウト時にアクセストークンの再発行に使用されます。問題は、クライアントにアクセストークンを渡したくないのですが、memcachedに保存するためにnginxを使いたいということです。だから、私の全体のタスクは、現在のように単純に見えるバックエンドからの応答をフィルタリングすることである。nginx + Luaを使って応答をフィルタリングしてmemcachedに保存します

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

nginxのは、この応答をフィルタリングし、このレスポンスからアクセストークンを取得し、memcachedの中でそれを保存する必要があります。あなたが見ることができるように、任意のより多くの何access_tokenはあってはならない

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

:最後に、それはクライアントに新しい応答を返す必要があります。アクセストークンは、私がセキュアにしようとするものであり、それを表示せず、クライアントに渡すことさえしようとするものです。私が知りませんが、これを実装するための最良の方法は何ですか、私はこの作業のためにLuaブロックを使用する必要があります。私は約body_filter_by_lua知っているが、ドキュメントは間もなくことを言う:以下のAPI関数は、現在、原因nginxの出力フィルタの現在の実装で

そうで制限があるため、このコンテキスト内で無効になっていることを

が、それはのように思えますボディのフィルタリングはかなり制限されており、このブロックの中でmemcached APIを呼び出すことができるかどうかはわかりません。だから、どうすれば私の仕事を現実世界に実装できますか?少なくとも、私はこの仕事に近づくために何を使うべきですか?

答えて

1

たとえば、コンテンツハンドラ内のバックエンドにサブリクエスト(例:ngx.location.capture)を発行できます。 次にbodyを必要に応じてフィルタリングし、cosocket APIを使用するlua-resty-memcachedを使用することができます。

このアプローチの欠点は、完全なバッファ付きプロキシを使用することです。

+0

ありがとう、アレクサンダー!あなたは完全にバッファリングされたプロキシが欠点である理由をちょっと詳しく教えてください。私はnginxには新しく、これらのニュアンスを知らない。 – Jacobian

+1

上流のサーバーが巨大なボディで応答すると想像してください。通常、それはいくつかのチャンクで送信されます。 Nginxはすべてのチャンクを処理し、デフォルトではフルレスポンスボディを待たずにクライアントに返します。いくつかのリソースを節約し、より効果的です。フル・バッファ・アプローチでは、ヘッダー/本文をどこかに保存する必要があります。メモリに保存すると、負荷が高い状態でスワップしている可能性があります。ファイルに保存すると、IOオーバーヘッドが発生します。 –

関連する問題