Как обработать ответ от www-authenticate в nginx?

Я использую openresty nginx v1.11.2.4. Я хочу иметь возможность аутентифицировать пользователей до того, как им будет предоставлен доступ к ресурсу или до того, как они попытаются разместить что-либо на сервере. Я использую http_auth_request_module, и следующее исключение из моего файла nginx.conf:

location /video/ {
        auth_request /auth;
        root /usr/local/openresty/nginx/html;
    }

    location = /auth {
        more_set_headers "WWW-Authenticate: Basic";
        return 401;
    }

Это приводит к тому, что браузер запрашивает учетные данные пользователя, но как мне теперь получить/обработать учетные данные пользователя от клиента?


person Ayudh    schedule 02.08.2017    source источник


Ответы (2)


Модуль ngx_http_auth_request_module реализует авторизацию клиента на основе результата подзапроса.

Если вы хотите использовать обычную аутентификацию, вам не нужно использовать ngx_http_auth_request_module. Используйте http://nginx.org/en/docs/http/ngx_http_auth_basic_module.html

person Alexander Altshuler    schedule 03.08.2017
comment
По неизвестным мне причинам меня попросили использовать директиву auth_request - person Ayudh; 08.08.2017

следуя ответу на вопрос здесь: аутентификация Nginx с модулем auth_request я смог для обработки имени пользователя и пароля, обратившись к переменной $http_authorization в моем файле nginx.conf. Ниже приведен отрывок из моего nginx.conf:

location /video {
        satisfy any;
        auth_basic "Private Property";
        auth_basic_user_file /usr/local/openresty/nginx/conf/htpasswd;
        auth_request /auth;
        root /usr/local/openresty/nginx/html;
        client_max_body_size 1000M;
        if ($request_method != "GET"){
            content_by_lua_file /root/Documents/contentbylua.lua;
        }
    }

location = /auth {
    set $authHeader $http_authorization;
    set $authUName $remote_user;
    content_by_lua_file /root/Documents/restrict.lua;
}

Следующая конфигурация позволяет мне аутентифицировать пользователя, чьи учетные данные хранятся в redisDB в файле limited.lua, который возвращает код 200 или 401 в зависимости от учетных данных пользователя обратно в блок /location.

Доступ к ответу (имя пользователя и пароль) осуществляется в файле limited.lua с помощью ngx.var.authHeader. Выполняется некоторая обработка строк для удаления «Basic», затем остаток декодируется в base64, а затем выполняется некоторая обработка строк для получения пароля. Это все

person Ayudh    schedule 08.08.2017
comment
Это действительно неправильное использование ngx_http_auth_request_module и ngx_http_auth_basic_module. Если вы реализуете аутентификацию на основе Redis, просто запустите свой код в access_by_lua_* в том же месте. Изнутри Lua у вас уже есть доступ ко всем переменным nginx. нет необходимости в заданных директивах. И почему вы используете директивы auth_basic*? - person Alexander Altshuler; 08.08.2017
comment
Я использовал директивы auth_basic для запроса учетных данных пользователя. Я вижу вашу точку зрения на ненужные директивы. - person Ayudh; 08.08.2017
comment
Добавьте access_by_lua* в местоположение /video. Проверьте, существует ли заголовок авторизации. Если нет - отвечает 401 и WWW-Authenticate. Если авторизация существует, проверьте ее на Redis. И полностью отбросьте ngx_http_auth_request_module и ngx_http_auth_basic_module. - person Alexander Altshuler; 08.08.2017
comment
И последнее замечание: никогда не используйте базовую HTTP-аутентификацию с HTTP-транспортом. - person Alexander Altshuler; 08.08.2017
comment
Спасибо за руководство. Да, я буду иметь в виду последний комментарий - person Ayudh; 08.08.2017