Re: Возможность проверить успешность auth_basic авторизации

Maxim Dounin mdounin на mdounin.ru
Ср Фев 14 18:22:53 UTC 2018


Hello!

On Thu, Feb 15, 2018 at 12:28:56AM +0700, Vadim A. Misbakh-Soloviov wrote:

> Всем привет.
> У меня тут возникла необходимость в проверке успешности auth_basic авторизации 
> (каковая, например, есть для client_certificate ($ssl_client_verify)).
> 
> У меня была идея сделать (средствами NginX) basic-авторизацию (в одном и том 
> же локейшне) необязательной, но принципиально применимой. И в случае 
> предоставления логина-пароля — обрабатывать этот кейс (а точнее - использовать 
> содержимое $remote_user для определённых целей).
> 
> Логичным решением мне показалось использовать `satisfy any`+`allow all`
> +`auth_basic`.
> 
> Однако в данном случае при предоставлении неправильного пароля в $remote_user 
> всё равно оказывается переданное имя пользователя. Что является немного не тем 
> результатом, на который я рассчитывал, но с этим можно было бы смириться (в 
> конце концов, никто и не говорил, что директива содержит имя только в случае 
> успешной авторизации), если бы был способ проверить успешность авторизации. А 
> такового я не нашёл (возможно, плохо искал).
> 
> В общем, подскажите пожалуйста:
> 
> 1) есть ли способ узнать, была ли авторизация успешной? Может, я и в самом 
> деле слепой и не вижу в документации того, что там есть?

Если в конфиге сказано "satisfy any; allow all; auth_basic ...", 
то проверки паролей в соответствии с auth_basic вообще не будут 
выполняться.  Операция проверки IP-адреса дешевле, и делается в 
первую очередь.  Если она говорит, что доступ следует 
предоставить, то доступ предоставляется без каких-либо дальнейших 
проверок.

Соответственно вопрос, была ли аутентификация успешной, в такой 
конфигурации не имеет ответа, так как самой аутентификации - не 
было.

Кроме того, сама http-аутентификация предполагает, что браузер 
отправляет заголовок Authorization в ответ на 401 c 
WWW-Authenticate, и непонятно, откуда она вообще возьмётся в такой 
конфигурации.

> 2) может быть, есть иной способ добиться того, что я хотел кроме `satisfy any`
> +`allow all`?

Я бы не рекомендовал строить подобные системы, но если очень 
хочется - можно попробовать посмотреть в сторону auth_request.

Тут можно либо реализовать любую собственную логику с помощью 
имеющегося интерфейса, либо же схитрить, и воспользоваться тем, 
что auth_request выполняется после auth_basic (что, впрочем, 
implementation detail, так что caveat emptor applies).  В 
результате в конфигурации вида


    location / {
        satisfy any;
        auth_basic secure;
        auth_basic_user_file /tmp/foo;
        auth_request /auth;
        add_header X-Auth $remote_user:$auth_failed;
    }

    location /auth {
        set $auth_failed 1;
        return 204;
    }

всегда будет делаться проверка по auth_basic, и в случае, если 
проверка по auth_basic не была успешна по какой-либо причине - 
переменная $auth_failed будет установлена в 1.

-- 
Maxim Dounin
http://mdounin.ru/


Подробная информация о списке рассылки nginx-ru