auth_request +登录屏幕与浏览器重定向

时间:2018-09-24 08:07:44

标签: php nginx nginx-location nginx-reverse-proxy

当某人访问某个网站时,我希望他设置特定的Cookie。 此类cookie是通过auth_request检查的,并且403应该最终出现在登录屏幕中(需要HTML / PHP,因此不需要auth_basic)。 成功进行身份验证后,它将重定向到“ foo.example.org”。 因此,我编写了一个配置,并在代理中完成了所有工作。

问题是:浏览器输入foo.example.org,记住先前的重定向并保持重定向到登录屏幕。

我可以更改什么,以使浏览器不重定向(不在缓存中)? 诸如“ foo.example.org?au​​th”之类的东西或完全具有内部auth的东西。

server {

    server_name foo.example.org;

    location / {
        auth_request /restricted;
        error_page 403 = @error403;

        proxy_pass http://10.12.34.56;
        resolver 127.0.0.11 ipv6=off;

        proxy_redirect   off;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Host $server_name;
    }

    location @error403 {
        return 307 /restricted;
    }

    location /restricted {
        proxy_pass http://auth_server;

        proxy_redirect   off;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Host $server_name;
    }
}

1 个答案:

答案 0 :(得分:1)

您返回的是307 Temporary Redirect而不是403 Forbidden的响应,它可能只是缓存在浏览器中,因此保持重定向。它只是在执行您要执行的操作。

无论如何,您都在为自己的生活艰难,这样做实际上要容易得多。

使用map指令检查cookie,并根据其值设置自定义变量。假设他们需要Cookie secret才能拥有值password才能进入:

map $cookie_secret $notloggedin {
  default  1;
  password 0;
}

现在$notloggedin将始终设置为1,除非客户端请求具有Cookie secret=password,然后它将设置为0,在Nginx中也等同于空/未设置。

现在,我们将该变量放入location块的if条件中。对于在场所中使用if条件的情况有些困惑,很多人会告诉您您不应该使用它们,但是the docs明确指出:

  

如果在某个位置,则只能在内部进行100%安全的操作   上下文是:

     

返回...;   重写...最后;

这样就可以了。

location / {
  if ($notloggedin) {
    return https://example.com/login;
  }

没有cookie的人现在被重定向到登录页面。