在iframe中使用令牌认证在Nginx反向代理后面设置Grafana泊坞窗

时间:2019-02-03 14:37:35

标签: grafana nginx-reverse-proxy

我正在尝试在nginx反向代理后面的docker-compose上运行Grafana,只要我将[auth.anonymous]设置为enabled = true,它就可以正常工作。

但是当我禁用匿名登录,并尝试在标题中使用“授权”令牌登录时,导航到Grafana sub_path时出现以下错误:

  

如果您看到此Grafana无法加载其应用程序文件

     
      
  1. 这可能是由于您的反向代理设置引起的。

  2.   
  3. 如果您在子路径下托管grafana,请确保您的grafana.ini root_path设置包含子路径

  4.   
  5. 如果您具有本地开发版本,请确保使用以下命令构建前端:npm run dev,npm run watch或npm run build

  6.   
  7. 有时重新启动grafana-server会有所帮助

  8.   

我的ngnix.conf设置为:

server {
  listen 80
  charset utf-8
  location /grafana-dashboard/ {
    proxy_pass http://grafana:3000/;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-Host $host;
    proxy_set_header X-Forwarded-Server $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_max_temp_file_size 0;
  }
}

Grafana在docker-compose上的grafana:3000上运行。

docker-compose.config.yaml的内容为:

version: '3.4'
services:
  grafana:
    container_name: grafana
    depends_on:
      - db
    networks:
    - static-network
    ports:
    - 3000:3000
    restart: always
    volumes:
    - grafana_stor:/var/lib/grafana
    environment:
    - GF_AUTH_PROXY_ENABLED=true
    - GF_SERVER_DOMAIN=10.0.0.3
    - GF_SERVER_ROOT_URL=http://10.0.0.3/grafana-dashboard/
    user: "472"

volumes:
  grafana_stor: {}

networks:
  static-network:
    ipam:
      config:
    - subnet: 172.20.0.0/16

在访问10.0.0.3/grafana-dashboard/之前,我先使用Grafana HTTP_API / api / auth / keys生成API_KEY,然后将返回的令牌传递到客户端的“ Authorization:Bearer [token]”标头上。

为了澄清起见,grafana-dashboard旨在显示在我的Web应用程序中的iframe上,但是由于我需要传递Authorization标头,因此我向nginx服务的/ grafana-dashboard /发出请求,然后将在iframe上出现“ blob”响应。

整个想法是要对grafana和我的webapp进行“单一登录”。 因此,刚刚登录Web应用程序的用户也无需登录grafana。但是,如果直接使用grafana(而不是通过iframe),则需要grafana登录屏幕或nginx简单身份验证。

3 个答案:

答案 0 :(得分:0)

您的问题:  1. API密钥用于API访问,但是您尝试使用API​​密钥加载UI(不是/api路径上可用的API)  2.您已启用身份验证代理,但未从nginx代理传递任何用户身份

解决方案:

  1. 解决代理(nginx)上的用户身份验证:无身份验证,基本身份验证,SSO(OIDC / SAML),LDAP,...
  2. 在请求标头中通过代理传递用户身份
  3. 为该请求标头正确配置Grafana身份验证代理:http://docs.grafana.org/auth/auth-proxy/

答案 1 :(得分:0)

如上所述Jan,您没有从nginx代理传递用户身份信息。我使用了基本身份验证,并将以下行添加到了位置块

proxy_set_header  Authorization "Basic <base64 encoded username:password>";

这使它起作用。最好是在Grafana中添加一个新的只读用户,并公开该用户而不是admin用户。您可能还想使用以下配置更新grafana.ini,以提高安全性。

session_life_time = 900
allow_sign_up = false
allow_org_create = false

答案 2 :(得分:0)

通过将Grafana HTTP API的API密钥作为cookie附加,我能够使它正常工作。然后,在我的let xxxx: Node[] = <COPY THE CONTENTS OF JSON> 中,我有:

nginx.conf

这样,您可以正常使用location /grafana-dashboard/ { # The important line: proxy_set_header Authorization "Bearer $cookie_grafana_key"; proxy_pass http://grafana:3000/; } ,而不必担心设置标题。

此外,我不确定这是否是nginx配置问题,但是当我在AJAX请求中添加了授权标头和API密钥(而不是将密钥作为cookie传递)时,我也收到了原始错误。我不确定那里是什么。