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。