Простая защита паролем на частном сайте next.js - PullRequest
0 голосов
/ 03 июля 2018

Я создаю приложение next.js и часами искал очень простой способ защитить приложение паролем. (Будет использоваться небольшой группой друзей)

Я пытался использовать http-аутентификацию Nginx на своем обратном прокси-сервере, и это работает, но это может раздражать необходимость входить в систему все время, поскольку вход в систему не сохраняется долго. (Похоже, что http-аутентификация Nginx 'выходит' или очень быстро забывает авторизацию)

Я также не хочу погружаться во что-то столь сложное, как NextAuth . Я не хочу регистрации пользователей, пользовательских представлений и т. Д. И т. Д.

Я просто хочу, чтобы люди могли ввести один пароль для просмотра сайта. И я бы хотел, чтобы он сохранялся в их браузере, чтобы им не приходилось постоянно входить в систему с http-аутентификацией Nginx.

Есть ли способ дать пользователям cookie-файл после прохождения http-аутентификации, а затем разрешить им доступ после получения cookie-файла?

Может кто-нибудь предложить довольно простое решение? Заранее спасибо.

1 Ответ

0 голосов
/ 03 июля 2018

Это можно сделать с помощью директивы Nginx map, которая позволяет установить переменную на основе другой переменной.

Где-то внутри вашего html-блока, но вне серверных блоков вы устанавливаете директиву map

map $cookie_trustedclient $mysite_authentication {
  default  "Your credentials please";
  secret-cookie-value off;
}

Здесь происходит следующее: Nginx устанавливает значение пользовательской переменной $mysite_authentication на основе значения файла cookie с именем trustedclient.

По умолчанию $mysite_authentication будет установлен на Your credentials please, если только у вас нет файла cookie с именем trustedclient со значением secret-cookie-value, в этом случае $mysite_authentication будет установлен на off

Теперь в пределах блока местоположения, в котором вы включили базовую аутентификацию, вы изменяете директиву auth_basic на использование новой переменной, например:

location /secretfiles {
    auth_basic $mysite_authentication;
    auth_basic_user_file .... 
    add_header Set-Cookie "trustedclient=secret-cookie-value;max-age=3153600000;path=/";
}

Вы можете установить cookie здесь или в коде вашего сайта. В результате директива auth_basic получает значение off для людей с нужным файлом cookie или сообщение для поля пароля для пользователей без него.

Не супер-безопасный, но простой и достаточно хороший для большинства вещей.

Редактировать из вашей конфигурации:

# Map block can go here
map $cookie_trustedclient $mysite_authentication {
  default  "Your credentials please";
  secret-cookie-value off;
}

server {
        listen 443 ssl default_server;
        listen [::]:443 ssl default_server;
 #       ssl     on; # Delete this line, obsolete directive
        ssl_certificate /etc/nginx/cloudflare-ssl/certificate.pem;
        ssl_certificate_key     /etc/nginx/cloudflare-ssl/key.key;

        ssl_client_certificate        /etc/nginx/cloudflare-ssl/cloudflare.crt;
        ssl_verify_client on;

        root /var/www/html;

        index index.html index.htm index.nginx-debian.html;

        server_name ********.com;

        location / {
                # First attempt to serve request as file, then
                # as directory, then fall back to displaying a 404.
                try_files $uri $uri/ =404;
             #   auth_basic "Restricted Content"; # Now this becomes:
                auth_basic $mysite_authentication;
                auth_basic_user_file /etc/nginx/.htpasswd;
                add_header Set-Cookie "trustedclient=secret-cookie-value;max-age=3153600000;path=/";
        }
}
...