auth_request + экран входа против перенаправлений браузера - PullRequest
0 голосов
/ 24 сентября 2018

Когда кто-то посещает сайт, я хочу, чтобы у него был определенный набор файлов cookie.Такой cookie проверяется через auth_request, и 403 должен появиться на экране входа в систему (необходим HTML / PHP, поэтому auth_basic не требуется).При успешной аутентификации он будет перенаправлен на «foo.example.org».Поэтому я написал в прокси-сервер конфигурацию и все такое.

Проблема в том, что браузер входит в foo.example.org, запоминает предыдущее перенаправление и продолжает перенаправлять на экран входа в систему.

Что я могу изменить, чтобы браузер не перенаправлял (из своего кеша)?Что-то вроде "foo.example.org?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 голосов
/ 24 сентября 2018

Вы возвращаете ответ 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 также равно пустому / неустановленному.

Теперь мы переместим эту переменную в условие if в блоке location.Существует некоторая путаница в отношении использования условий в местах, и многие люди скажут вам, что вы не должны их использовать, но документы четко указывают:

Единственное100% безопасные вещи, которые можно сделать внутри, если в контексте местоположения:

return ...;переписать ... last;

Так что все будет в порядке.

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

Люди без cookie теперь перенаправляются на страницу входа.

...