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

주석 처리가 제거된 경우 모든 요청은 200 상태 코드를 반환하는 Location /iprestricted.html을 사용하여 302 응답을 받습니다.

리디렉션 없이 하위 요청 인증을 구현하는 방법은 무엇입니까?

원본 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 응답이 발생하는 것에 대해 혼란스럽거나 우려되기 때문에 질문을 열어 두겠습니다.

관련 정보