我有一个在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
}
1条答案
按热度按时间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),以便容器中的应用程序知道它。当应用程序重定向到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
将是有用的)。