Nginx反向代理Grafana时iframe认证后仍跳转登录页问题
解决Grafana反向代理认证后仍跳转登录页的问题
问题核心是:虽然Nginx的auth_request已经通过Django认证返回200,但Grafana的代理认证模块没有获取到已认证用户的信息,所以依然会触发登录跳转。以下是具体修复步骤:
1. 补全Grafana代理认证的核心配置
当前grafana.ini里的auth.proxy仅开启了功能,但未指定从哪个请求头获取用户信息,导致Grafana无法识别已认证用户。修改配置如下:
#################################### Auth Proxy ########################## [auth.proxy] enabled = true # 指定Grafana读取用户信息的请求头名称 header_name = X-Forwarded-User # 对应头中的属性为用户名 header_property = username auto_sign_up = true ;sync_ttl = 60 ;whitelist = XXX, XXX ;headers = Email:X-User-Email, Name:X-User-Name ;headers_encoded = false ;enable_login_token = false [server] # 信任本地Nginx代理(Grafana与Nginx在同一服务器) trusted_proxies = 127.0.0.1 # 配置Grafana根URL,确保反向代理路径匹配 root_url = https://grafana.myserver.com/
2. 修改Nginx配置,传递用户信息到Grafana
需要让Nginx从Django认证接口的响应中提取用户信息,再转发给Grafana。假设你的Django/auth/check/接口在认证通过时会返回X-User响应头(值为用户名),修改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; # 从认证接口的响应头中提取用户名(对应Django返回的X-User头) auth_request_set $auth_user $upstream_http_x_user; 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; # 将用户名通过指定头传递给Grafana proxy_set_header X-Forwarded-User $auth_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; } }
3. 关键注意事项
- 匹配接口返回的用户头:如果Django认证接口返回的不是
X-User,要对应修改Nginx里的$upstream_http_xxx(比如返回X-Username就改成$upstream_http_x_username),同时同步修改Grafana的header_name。 - 重启服务:修改配置后,执行
systemctl restart nginx和systemctl restart grafana-server(根据你的服务管理方式调整)。 - 日志排查:若问题依旧,打开Grafana的debug日志(在
grafana.ini的[log]部分设置mode = debug),查看请求是否携带了正确的X-Forwarded-User头,以及Grafana是否成功识别用户。
内容的提问来源于stack exchange,提问作者shadow
相关产品推荐
相关产品推荐

