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

使用oauth2_proxy实现Grafana OAuth2登录后会话未同步问题求助

问题分析与解决方案

核心问题

你的配置混淆了两种OAuth集成模式,导致认证流程断裂:

  • Grafana配置了generic_oauth,试图将oauth2-proxy当作OAuth2身份提供商发起认证
  • oauth2-proxy配置了upstreams=http://localhost:3000/,试图作为反向代理前置到Grafana
    两种模式叠加后,认证成功后的会话无法被Grafana识别,最终重定向回登录页。

正确配置方案(oauth2-proxy前置反向代理模式)

这种模式适合对接企业IDP,由oauth2-proxy统一处理认证,Grafana信任oauth2-proxy传递的用户信息,无需自身处理OAuth流程。

修改后的docker-compose.yaml

# docker-compose.yml
version: '3'
services:
  grafana:
    container_name: grafana
    image: grafana/grafana:latest
    restart: always
    user: '104'
    volumes:
      - $PWD/data/grafana:/var/lib/grafana
    # 不再暴露端口给宿主机,仅在docker网络内被oauth2-proxy访问
    environment:
      # [users]
      - GF_USERS_ALLOW_SIGN_UP=false
      - GF_USERS_AUTO_ASSIGN_ORG=true
      - GF_USERS_AUTO_ASSIGN_ORG_ROLE=Admin

      # [auth]
      - GF_AUTH_DISABLE_LOGIN_FORM=true
      - GF_AUTH_ANONYMOUS_ENABLED=false

      # 启用反向代理认证,信任oauth2-proxy传递的用户头
      - GF_AUTH_PROXY_ENABLED=true
      - GF_AUTH_PROXY_HEADER_NAME=X-Forwarded-User
      - GF_AUTH_PROXY_HEADER_EMAIL=X-Forwarded-Email
      - GF_AUTH_PROXY_AUTO_SIGN_UP=true
      - GF_AUTH_PROXY_WHITELISTED_IPS=172.17.0.0/16  # docker默认网段,根据实际调整

  oauth2-proxy:
    container_name: oauth2-proxy
    image: quay.io/oauth2-proxy/oauth2-proxy:latest
    restart: always
    ports:
      - 4180:4180
    volumes:
      - $PWD/data/oauth2:/var/lib/oauth2_proxy
    environment:
      - OAUTH2_PROXY_PROVIDER=oidc
      - OAUTH2_PROXY_CLIENT_ID=<google_client_id>
      - OAUTH2_PROXY_CLIENT_SECRET=<google_client_secret>
      - OAUTH2_PROXY_OIDC_ISSUER_URL=https://accounts.google.com
      - OAUTH2_PROXY_COOKIE_SECRET=<some_secret>
      - OAUTH2_PROXY_COOKIE_DOMAIN=localhost  # 去掉http://,仅保留域名/主机名
      - OAUTH2_PROXY_EMAIL_DOMAINS=*
      - OAUTH2_PROXY_REDIRECT_URL=http://localhost:4180/oauth2/callback  # 回调地址指向oauth2-proxy自身
      - OAUTH2_PROXY_HTTP_ADDRESS=http://:4180
      - OAUTH2_PROXY_UPSTREAMS=http://grafana:3000/  # 通过docker服务名访问Grafana
      - OAUTH2_PROXY_COOKIE_SECURE=false
      - OAUTH2_PROXY_ERRORS_TO_INFO_LOG=true
      # 启用传递用户头信息给Grafana
      - OAUTH2_PROXY_SET_XAUTHREQUEST=true
      - OAUTH2_PROXY_PASS_ACCESS_TOKEN=true
      - OAUTH2_PROXY_PASS_USER_HEADERS=true

配置说明

  1. Grafana部分:

    • 关闭generic_oauth,启用auth.proxy,信任来自oauth2-proxy的X-Forwarded-User和X-Forwarded-Email头
    • 不再暴露端口给宿主机,避免直接访问绕过oauth2-proxy
    • 设置GF_AUTH_PROXY_WHITELISTED_IPS为docker网段,仅信任来自oauth2-proxy的请求
  2. oauth2-proxy部分:

    • redirect_url改为指向oauth2-proxy自身的回调地址,而非Grafana
    • upstreams使用docker服务名grafana:3000访问Grafana,而非localhost
    • cookie_domain修正为localhost,去掉协议前缀
    • 添加SET_XAUTHREQUEST等参数,确保认证后将用户信息传递给Grafana

操作步骤

  1. 停止并清理原有容器:
docker-compose down -v
  1. 启动新配置:
docker-compose up -d
  1. 访问Grafana:
    通过oauth2-proxy的端口访问:http://localhost:4180
    此时会直接跳转到Google认证页面,认证成功后自动进入Grafana,会话同步生效。

额外注意事项

  • 确保Google OAuth应用的已授权重定向URI包含http://localhost:4180/oauth2/callback
  • 若docker网段不是默认的172.17.0.0/16,需调整Grafana的GF_AUTH_PROXY_WHITELISTED_IPS参数
  • 生产环境需启用OAUTH2_PROXY_COOKIE_SECURE=true并使用HTTPS

内容的提问来源于stack exchange,提问作者mariovalens

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 17:57:19