auth_request + экран входа против перенаправлений браузера

Когда кто-то посещает сайт, я хочу, чтобы у него был определенный набор файлов 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

Решение

Вы возвращаете 307 Temporary Redirect ответ вместо 403 Forbidden, он, вероятно, просто кешируется в браузере, поэтому продолжает перенаправлять. Это просто делает то, что вы говорите, чтобы сделать.

В любом случае, вы делаете жизнь трудной для себя, на самом деле это сделать намного проще.

Используйте директиву map, чтобы проверить наличие cookie и установить пользовательскую переменную в зависимости от значения. Предположим, что им нужно печенье secret иметь значение password чтобы попасть в:

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

Сейчас $notloggedin всегда будет установлен на 1 если запрос клиента не имеет cookie secret=passwordто будет установлено 0 который в Nginx также равняется пустому / неустановленному.

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

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

вернуть …;
переписать … последний;

Так что это будет хорошо.

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

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

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]