nginx通过身份验证服务代理所有请求

时间:2018-01-18 13:10:29

标签: nginx proxy

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

  1. 后端API
  2. 使用pushstate-server提供的前端REACT App
  3. 身份验证服务
  4. Nginx Container
  5. 我的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代理。

    我做错了什么?

1 个答案:

答案 0 :(得分:0)

这里有两个问题:

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

修复了这个问题
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;
}

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

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

相关问题