【问题标题】:nginx proxy all request through authentication servicenginx代理所有通过认证服务的请求
【发布时间】:2018-01-19 18:07:50
【问题描述】:

考虑一个包含以下容器的 dockerized 环境:

  1. 后端 API
  2. 使用 pushstate-server 服务的前端 REACT 应用程序
  3. 身份验证服务
  4. Nginx 容器

我的 nginx.conf 包含以下内容:

server {
    listen 8080;        

    location / {
        auth_request /auth;
        proxy_pass http://frontend:5000;
    }       

    location = /auth {
        proxy_pass http://auth:6000;
    }

    error_page 403 = @error403;
    location @error403 {
        rewrite ^ /login$1;
        proxy_pass http://frontend:5000;
    }
}

auth_request /auth; 行被注释掉时,一切正常,所有前端页面都可以访问。

只要我介绍了auth_request,我就可以看到身份验证服务返回 403,但它看起来不像是登录页面的 Nginx 代理。

我做错了什么?

【问题讨论】:

    标签: nginx proxy


    【解决方案1】:

    这里有两个问题:

    首先,授权标头不会转发给身份验证服务。这是用

    修复的
    location = /auth {
        proxy_pass http://auth:6000;
        proxy_pass_header Authorization;
    }
    

    其次,当向前端发出请求时,nginx 会尝试使用auth 容器进行身份验证。由于我未通过身份验证,因此失败并返回 403。然后 nginx 服务器代理到 REACT 容器上的登录页面,但是,在后台有进一步的请求从同一容器中检索 cssjs 资源, nginx 网关尝试对其进行身份验证。同样,由于我未通过身份验证,检索这些资源失败,因此页面不会呈现。

    一个肮脏的解决方案是添加:

    location /static/js/main.1e2389bc.js {
        proxy_pass http://web:5000;
    }
    
    location /static/css/main.aa587518.css {
        proxy_pass http://web:5000;
    }
    

    这会检索必要的文件来呈现登录页面并尝试进行身份验证。这是一个糟糕的解决方案,因为可能存在其他资源(网站图标、其他媒体等),因此需要添加更多块。我确信有一个简单的解决方案使用正则表达式以简单的方式解决这个问题。

    但是,我最终得到了一个更清洁的解决方案。对后端 API 的请求进行身份验证。这确保了在未经身份验证的情况下不会在前端显示任何敏感信息,并消除了破解解决方案以呈现登录页面的麻烦。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多