私有next.js网站上的简单密码保护

时间:2018-07-03 12:48:12

标签: reactjs express nginx nextjs

我正在制作next.js应用程序,并且花了数小时寻找一种非常简单的密码保护应用程序的方法。 (将由一小部分朋友使用)

我尝试在我的反向代理上使用Nginx的http auth,并且可以正常工作,但是由于登录时间不长,必须一直登录很烦人。 (Nginx的http auth似乎“注销”或很快忘记了授权)

我也不想陷入像NextAuth这样复杂的事情。我不希望用户注册,自定义视图等,等等。

我只希望人们能够输入一个密码来查看站点。而且我希望它能够在他们的浏览器中保持不变,这样他们就不必一直使用Nginx的http auth登录。

一旦用户通过http auth,有没有办法给用户一个cookie,然后在获得cookie后允许他们进入?

有人可以提出一个相当简单的解决方案吗?预先感谢。

1 个答案:

答案 0 :(得分:1)

您可以使用Nginx map指令来执行此操作,该指令可让您基于另一个变量来设置变量。

在html块内的某个位置,但在任何服务器块外的位置,您都设置了地图指令

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

这里发生的是Nginx正在基于名为$mysite_authentication的cookie的值来设置自定义变量trustedclient的值。

默认情况下,$mysite_authentication将设置为Your credentials please,除非您有一个名为trustedclient的Cookie,其值为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。对于具有正确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=/";
        }
}