別のバックエンドにプロキシする前に、1 つのバックエンドの応答を確認します。

別のバックエンドにプロキシする前に、1 つのバックエンドの応答を確認します。

Nginx フロントエンドの背後の 2 つの場所に 2 つのバックエンドがあります。バックエンド A は OAuth による認証を実装しています。バックエンド B は実装していません。

場所 B に認証を追加する簡単な方法は、まず各リクエストをバックエンド A に送信することだと思います。私が考えているフローは次のとおりです。

request for /b/kitten.png --> [ nginx ]
                              [ nginx ] --> request for /index.html --> [backend A]
                            if A responds 200:
                              [ nginx ] --> request for /kitten.png --> [backend B]
                            otherwise return what A returned (redirect to OAuth)

これは Nginx で可能ですか? できない場合は、OpenResty/HAProxy/Traefik で可能でしょうか?

答え1

完全な回答ではありませんが、コメントするには少し長すぎます。

あなたが説明したセットアップは、概念的にはかなり一般的な戦略に似ています。

  • 認証を1つのシステムにオフロードする
  • リバースプロキシを使用して、認証されたクライアントのみが他のアプリケーション/バックエンドにアクセスできるようにします(リクエストを検査することにより)
  • 認証されていないクライアントはリバース プロキシによって拒否されます (理想的には認証プロバイダーからのログイン ページにリダイレクトされ、認証に成功するとアプリにリダイレクトされます)
  • 認証されたクライアントにはアクセスが許可されます。

これには、リバース プロキシでクライアントが送信するヘッダー/Cookie/セッション トークンを検証する方法が必要です。もちろん、リバース プロキシによって公開されるアプリケーションが独自のログイン/認証方法を提供する必要がないという利点があります。

nginx の場合、このようなメソッドを作成するには、少しの lua コードを使用するのが一般的な方法のようです。

例えば、 access_by_luaこの方法は、認証プロバイダーとして nginx と keycloak を統合するためによく使用されます。例を参照してください。ここそしてここ

関連情報