Jenkins/Nginx - 双重提示基本身份验证,为什么?为什么有内部 Jenkins 授权?
Jenkins/Nginx - Double prompted for basic auth, why? Why is there an internal Jenkins auth?
下面是我的 Jenkins 的 nginx 配置文件。其中大部分与我在文档中读到的完全一致。
配置文件:
upstream app_server {
server 127.0.0.1:8080 fail_timeout=0;
}
server {
listen 80;
listen [::]:80 default ipv6only=on;
server_name sub.mydomain.net;
location ^~ /jenkins/ {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
if (!-f $request_filename) {
proxy_pass http://app_server;
break;
}
auth_basic "[....] Please confirm identity...";
auth_basic_user_file /etc/nginx/.htpasswd;
}
}
导航到 http://sub.mydomain.net/jenkins 时,系统提示我进行基本身份验证 服务器说:[....] 请确认身份...。
这是正确的,但是一旦我输入正确的凭据,我就会再次得到 提示再次 进行基本身份验证,但是这次:服务器说: 詹金斯。
第二个隐藏的basic_auth来自哪里?!这对我来说没有任何意义。
在第一次提示时点击 CANCEL 然后我正确地收到 401 需要授权 错误。
在第二个基本身份验证 ("Server says: Jenkins") 上点击 CANCEL 我得到:
HTTP ERROR 401
Problem accessing /jenkins/. Reason:
Invalid password/token for user: _____
Powered by Jetty://
有谁知道可能发生了什么?
我也有这个问题,在我的情况下,这是由于在 jenkins 本身中启用了安全性,禁用安全性解决了这个问题。
根据他们的文档:
If you do access control in Apache, do not enable security in Jenkins, as those two things will interfere with each other.
https://wiki.jenkins-ci.org/display/JENKINS/Apache+frontend+for+security
似乎正在发生的事情是 nginx 将 auth_basic 响应转发给 jenkins,jenkins 试图执行 auth_basic 作为响应。我还没有找到令人满意的解决方案。
通过搜索用作任何其他具有 basic_auth 的应用程序的反向代理的 Nginx,找到了我的问题的解决方案。
解决方案是在这里找到的答案:
https://serverfault.com/questions/511846/basic-auth-for-a-tomcat-app-jira-with-nginx-as-reverse-proxy
我的 nginx 配置中缺少的行是:
# Don't forward auth to Tomcat
proxy_set_header Authorization "";
默认情况下,在基本身份验证之后,Nginx 似乎还会将身份验证 headers 转发给 Jenkins,这就是导致我出现问题的原因。 Jenkins 收到转发的 auth headers 然后认为它也需要授权自己?!
如果我们将反向代理设置为不转发任何授权 headers,如上所示,那么一切都会正常进行。 Nginx 将提示 basic_auth 并且在成功验证后我们在转发到我们的反向代理时明确清除(重置?)验证 headers。
下面是我的 Jenkins 的 nginx 配置文件。其中大部分与我在文档中读到的完全一致。
配置文件:
upstream app_server {
server 127.0.0.1:8080 fail_timeout=0;
}
server {
listen 80;
listen [::]:80 default ipv6only=on;
server_name sub.mydomain.net;
location ^~ /jenkins/ {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
if (!-f $request_filename) {
proxy_pass http://app_server;
break;
}
auth_basic "[....] Please confirm identity...";
auth_basic_user_file /etc/nginx/.htpasswd;
}
}
导航到 http://sub.mydomain.net/jenkins 时,系统提示我进行基本身份验证 服务器说:[....] 请确认身份...。
这是正确的,但是一旦我输入正确的凭据,我就会再次得到 提示再次 进行基本身份验证,但是这次:服务器说: 詹金斯。
第二个隐藏的basic_auth来自哪里?!这对我来说没有任何意义。
在第一次提示时点击 CANCEL 然后我正确地收到 401 需要授权 错误。
在第二个基本身份验证 ("Server says: Jenkins") 上点击 CANCEL 我得到:
HTTP ERROR 401
Problem accessing /jenkins/. Reason:
Invalid password/token for user: _____
Powered by Jetty://
有谁知道可能发生了什么?
我也有这个问题,在我的情况下,这是由于在 jenkins 本身中启用了安全性,禁用安全性解决了这个问题。
根据他们的文档:
If you do access control in Apache, do not enable security in Jenkins, as those two things will interfere with each other.
https://wiki.jenkins-ci.org/display/JENKINS/Apache+frontend+for+security
似乎正在发生的事情是 nginx 将 auth_basic 响应转发给 jenkins,jenkins 试图执行 auth_basic 作为响应。我还没有找到令人满意的解决方案。
通过搜索用作任何其他具有 basic_auth 的应用程序的反向代理的 Nginx,找到了我的问题的解决方案。
解决方案是在这里找到的答案: https://serverfault.com/questions/511846/basic-auth-for-a-tomcat-app-jira-with-nginx-as-reverse-proxy
我的 nginx 配置中缺少的行是:
# Don't forward auth to Tomcat
proxy_set_header Authorization "";
默认情况下,在基本身份验证之后,Nginx 似乎还会将身份验证 headers 转发给 Jenkins,这就是导致我出现问题的原因。 Jenkins 收到转发的 auth headers 然后认为它也需要授权自己?!
如果我们将反向代理设置为不转发任何授权 headers,如上所示,那么一切都会正常进行。 Nginx 将提示 basic_auth 并且在成功验证后我们在转发到我们的反向代理时明确清除(重置?)验证 headers。