如何使用Azure和Nginx获得正确的重写URL?

3mpgtkmj  于 2023-10-17  发布在  Nginx
关注(0)|答案(1)|浏览(126)

我有一个在Docker容器中运行的应用程序,并在端口5080上监听HTTP流量。托管这个(和其他)容器的服务器正在运行nginx作为反向代理。nginx监听443上的https流量,当服务器名称匹配时,它会代理http://127.0.0.1:5080/。到目前为止还不错。
容器中的应用程序正在使用Azure支持的OpenID身份验证。我相信我有正确的Azure配置,包括将回复URL设置为https://example.com/_renarde/security/oidc-success
当我尝试登录时,我被重定向到login.microsoft.com并提供我的凭据。这很好,所以它试图把我送回应用程序。但是,我得到了这个错误:
请求中指定的重定向URI“http://127.0.0.1:5080/j_oauth_callback”与为应用程序配置的重定向URI不匹配
好像代理地址泄露了。我找到了nginx的proxy_redirect引用,但这并没有解决问题。
当应用程序向Azure发送回复URL时,如何让nginx使用原始域名?

server {
        server_name example.com; # managed by Certbot

        location / {
            proxy_pass http://127.0.0.1:5080/;
            proxy_redirect http://127.0.0.1:5080/ https://example.com/;
            proxy_set_header Host $proxy_host;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }

        listen 443 ssl; # managed by Certbot
        ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; # managed by Certbot
        ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; # managed by Certbot
        include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
        ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
    }
qybjjes1

qybjjes11#

我认为主要的问题是你设置代理Host头不正确。
从docs:

$proxy_host

proxy_pass指令中指定的被代理服务器的名称和端口;
所以基本上$proxy_host将是127.0.0.1:5080,因此容器中的应用程序将始终认为它以127.0.0.1:5080运行。
相反,您可能希望使用$http_host,这是原始“Host”请求头的值。所以基本上你传递给nginx的相同的Host进一步到容器中的应用程序(即,example.com),以便容器中的应用程序知道它。

proxy_set_header Host $http_host;

当应用程序重定向到www.example.com时login.microsoft.com,必须提供redirect_uri查询字符串参数。我的假设是,它试图指向自身,并从请求的Host头中选择自身的URL。
至于proxy_redirect,如果你的应用重定向到它自己,它会被触发,例如。返回的响应头为Location: http://127.0.0.1:5080/new_location。但是您的应用程序重定向到login.microsoft.com-即返回smth。例如Location: https://login.microsoftonline.com/common/oauth2/v2.0/authorize?redirect_uri=http://127.0.0.1:5080/j_oauth_callback&...-在这种情况下,它将不会被重写。
我相信我有正确的Azure配置,包括将回复URL设置为https://example.com/_renarde/security/oidc-success
根据错误消息,回复URL的意思似乎与您使用的任何身份验证库作为redirect_uri发送到www.example.com的URL不同login.microsoft.com。也许它会重定向到该回复URL一个成功的身份验证?(如果是这种情况,proxy_redirect将是有用的)。

相关问题