You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让Grafana复用React+DRF项目的现有JWT令牌实现免登认证

方案可行性说明

完全可行,核心是基于Grafana原生支持的Auth Proxy代理认证模式,配合现有系统的JWT校验逻辑即可实现免密登录,同时支持自动创建不存在的用户账号。

具体实现步骤

1. 改造前端跳转逻辑

你的JWT令牌存储在localStorage中,Nginx默认无法直接获取该值,因此需要调整前端访问Grafana的跳转逻辑:

  • 用户点击Grafana入口或者主动访问/grafana路径时,前端从localStorage取出当前有效的access令牌,拼接在跳转URL的查询参数中,跳转目标为/grafana?token=你的access令牌值
  • 可选优化:跳转前先校验access令牌有效期,如果已经过期,先调用DRF的刷新令牌接口用refresh令牌换取新的有效access令牌,再发起跳转,避免用户被拦截到登录页

2. 配置Nginx反代与JWT校验

Nginx 1.11+以上官方版本默认自带ngx_http_auth_jwt_module校验模块,OpenResty也内置该模块,直接编辑Nginx配置文件添加如下规则即可:

http {
    # 配置JWT签名密钥,和你DRF settings.py中的SECRET_KEY完全一致
    auth_jwt_key "你的DRF_SECRET_KEY" file;
    # djangorestframework-simplejwt默认使用HS256算法,对应配置即可
    auth_jwt_alg HS256;

    server {
        listen 80;
        server_name 你现有Web应用的域名;

        # 此处省略你原有Web应用的Nginx配置规则...

        # Grafana反代规则
        location /grafana/ {
            # 从查询参数中获取JWT令牌做校验
            auth_jwt $arg_token;
            # 令牌校验失败跳转回你现有系统的登录页
            error_page 401 = /login;

            # 解析JWT payload内的用户字段,和simplejwt默认生成的字段对应即可
            set $grafana_user $jwt_claim_user_id;
            set $grafana_email $jwt_claim_email;
            set $grafana_name $jwt_claim_username;
            # 可根据JWT内的权限字段设置Grafana角色,可选值为Viewer/Editor/Admin
            set $grafana_role "Editor";

            # 向Grafana传递身份认证头
            proxy_set_header Host $host;
            proxy_set_header X-WEBAUTH-USER $grafana_user;
            proxy_set_header X-WEBAUTH-EMAIL $grafana_email;
            proxy_set_header X-WEBAUTH-NAME $grafana_name;
            proxy_set_header X-WEBAUTH-ROLE $grafana_role;

            # 反代到你实际部署的Grafana服务地址
            proxy_pass http://Grafana部署的内网IP:3000/;
            proxy_redirect off;
        }
    }
}

配置完成后执行nginx -s reload生效。

3. 配置Grafana开启代理认证

修改Grafana的配置文件custom.ini(默认存放在/etc/grafana/目录下),修改对应配置段:

[server]
# 配置Grafana服务的根路径,和Nginx反代的子路径对应
root_url = %(protocol)s://%(domain)s/grafana/
serve_from_sub_path = true

[auth.proxy]
# 开启代理认证模式
enabled = true
# 对应Nginx传递的用户名字段
header_name = X-WEBAUTH-USER
header_property = username
# 开启自动创建不存在的用户账号
auto_sign_up = true
# 开启邮箱、用户名、角色的头传递
headers = Name:X-WEBAUTH-NAME Email:X-WEBAUTH-EMAIL Roles:X-WEBAUTH-ROLE
# 配置白名单,只允许你的Nginx服务IP访问,避免外部伪造请求头攻击
whitelist = 127.0.0.1/32,你的Nginx服务内网IP/32
# 关闭Grafana自带的登录入口,认证失败直接返回401
enable_login_token = false

修改完成后执行systemctl restart grafana-server重启服务生效。

安全注意事项
  • 生产环境必须配置HTTPS,避免查询参数中的令牌被窃听
  • 必须严格配置Grafana的代理认证白名单,禁止外部直接访问Grafana的3000端口
  • JWT签名密钥必须和DRF侧完全一致,不要泄露
  • 可根据现有系统的权限体系,动态设置传递给Grafana的角色头,实现权限统一管控

内容的提问来源于stack exchange,提问作者Görkem Özer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 05:15:03