Nginx认证iframe

qmb5sa22  于 2023-08-03  发布在  Nginx
关注(0)|答案(1)|浏览(123)

我在一个服务器上运行一个Django应用程序,我在另一个服务器上运行grafana,nginx作为反向代理(grafana和nginx在同一个服务器上)。
我可以设法重定向一个传入的URL并通过我的后端对其进行身份验证,但我仍然会被重定向到grafana登录屏幕,即使我的django应用程序发送了一个200响应
我的设置:
1.我有一个grafana服务器在https下运行,带有nginx代理。nginx设置

server {
    server_name  grafana.myserver.com;
     
    location / {
        proxy_set_header Host $host;
        proxy_pass           http://localhost:3000/;
        proxy_set_header X-Real-IP $remote_addr;
    }

    location ~ ^/iframe(.*)$ {
      auth_request /iframe-auth;
      set $iframe_url http://localhost:3000$1$is_args$args;
        proxy_pass $iframe_url;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header Authorization $http_authorization;
    }

    location = /iframe-auth {
        internal;
        proxy_pass https://blub.de/auth/check/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_pass_request_body off;
        proxy_set_header Content-Length "";
        proxy_set_header X-Original-URI $request_uri;
    }

}

字符串
在上面的例子中,我使用nginx auth模块来重定向来自我的django后端服务器iframe的传入URL。在这里,我进行身份验证,效果很好。我通过打印出URL来测试这一点,我正在验证用户,如果通过验证,我将返回200响应。
好吧,酷。我现在希望我的iframe会显示在我的网站上。但事实并非如此。相反,我得到一个重定向到grafana登录屏幕。
nginx可以做我想做的事情吗?
我的grafana.ini配置是标准的,我没有做太大的改变,但我将auth.proxy设置为启用:

#################################### Auth Proxy ##########################
[auth.proxy]
enabled = true
;header_name = X-WEBAUTH-USER
;header_property = username
auto_sign_up = true
;sync_ttl = 60
;whitelist = XXX, XXX
;headers = Email:X-User-Email, Name:X-User-Name
# Non-ASCII strings in header values are encoded using quoted-printable encoding
;headers_encoded = false
# Read the auth proxy docs for details on what the setting below enables
;enable_login_token = false


任何帮助都是感激的。提前致谢

voase2hg

voase2hg1#

我在“Grafana documentation / Set up / Configure security / Configure authentication / Auth proxy”中读到

# HTTP Header name that will contain the username or email
header_name = X-WEBAUTH-USER

字符串
换句话说,为了让Grafana的auth代理功能正常工作,它希望看到一个包含用户名的特定头。该头由grafana.ini文件中的header_name定义。
但是在您的例子中,header_namegrafana.ini文件中被注解掉了。此外,在Nginx配置中没有header_name的设置。因此,很可能Grafana不知道 * 在哪里 * 查找用户名...这使其重定向到登录屏幕。
尝试将header_name添加回grafana.ini,并将其设置为类似X-WEBAUTH-USER或您选择的任何头名称。参见“Single sign-on authentication on Django and Grafana”作为说明。
然后,在Nginx配置中(在/iframe位置块中),您需要使用proxy_set_header设置此头文件并将其沿着给Grafana。你的Django应用程序应该在成功认证后返回这个头,Nginx应该拾取它并传递沿着。

server {
    server_name  grafana.myserver.com;
     
    location / {
        proxy_set_header Host $host;
        proxy_pass           http://localhost:3000/;
        proxy_set_header X-Real-IP $remote_addr;
    }

    location ~ ^/iframe(.*)$ {
      auth_request /iframe-auth;
      set $iframe_url http://localhost:3000$1$is_args$args;
        proxy_pass $iframe_url;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header Authorization $http_authorization;
        proxy_set_header X-WEBAUTH-USER $http_x_webauth_user;
    }

    location = /iframe-auth {
        internal;
        proxy_pass https://blub.de/auth/check/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_pass_request_body off;
        proxy_set_header Content-Length "";
        proxy_set_header X-Original-URI $request_uri;
    }

}


如果X-WEBAUTH-USER$http_x_webauth_user不相同,则应将它们替换为经过身份验证的请求中的实际头名称和值。
proxy_set_header X-WEBAUTH-USER $http_x_webauth_user;行告诉Nginx从传入的请求中获取X-WEBAUTH-USER头部并将其沿着给Grafana。
确保你的Django应用在成功认证后返回这个头文件和用户名。
例如,在“Single sign-on authentication on Django and Grafana”中提到的Django视图(已经在上面提到过)。

相关问题