nginx サブリクエスト認証が期待どおりに動作しない

nginx サブリクエスト認証が期待どおりに動作しない

リバース プロキシ上の仮想ホスト全体にアクセス制御を追加したいと考えています。これを行うために、nginx サブリクエスト認証を使用しています。想定されるインタラクションは、ユーザーがログイン ページへのリンクを含むエラー メッセージを受け取るか、要求された URL でログイン ページがレンダリングされることです。ログイン プロセスが完了すると、ユーザーが最初に要求された URL に移動/再読み込みするためのメカニズムが必要です。リバース プロキシ自体にはスクリプト機能がありません (つまり、PHP はありません)。そのため、認証プロセスを通じて元の URL をキャプチャして伝播するためのオプションが制限されます。

私の予想:リクエストが認証に失敗した場合(つまりhttp://authprovider.example.com:8081/gateway/index.php401 を返します) リダイレクトなしで 4xx ステータスで、要求された URL に特定のコンテンツを返すようにします。

server {
    listen 80;
    server_name www.example.com;
    root /var/www/html;

    error_page 401 iprestricted.html;
    ## This provides feedback to the user when request is disallowed
    ## (including a link to login)
    # location /iprestricted.html {
    #       try_files $uri $uri/ =404;
    # }

    # This implements the sub-request check....
    location /restricted {
            internal;
            proxy_pass http://authprovider.example.com:8081/gateway/index.php ;
            proxy_pass_request_body off;
            proxy_set_header Content-Length "";
            proxy_set_header        X-Real-IP $remote_addr;
            proxy_set_header        X-Original-URI $request_uri;
    }
    location / {
            auth_request /restricted;
            proxy_pass http://localwebserver/;
    }
}

しかし:

コメントアウトされている場合location /iprestricted.html{...}、リダイレクトループが発生しますhttp://www.example.com

コメントが解除されている場合、すべてのリクエストは、Location /iprestricted.htmlで302レスポンスを受け取り、200ステータスコードを返します。

リダイレクトなしでサブリクエスト認証を実装するにはどうすればよいですか?

元の URL をキャプチャし、nginx 構成だけを使用してこれを認証手順に伝播する別の方法はありますか?

add_header WWW-Authenticate "Basic realm=bipdevtest";上記の場所をそれぞれ追加してみましたが、HTTP 応答で返されませんでした。

答え1

常に良いアイデアRTFM

Nginxは、auth_requestプロバイダからWWW-Authenticateヘッダーが返された場合、それを中継します(http://authprovider.example.com:8081/gateway/index.php上記参照)。

ただし、カスタム エラー ページによって 302 リダイレクトが発生し、その後に 200 応答が返されることに混乱/懸念があるため、この質問は未解決のままにしておきます。

関連情報