如何让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
相关产品推荐
相关产品推荐

