在nginx上使用一次性cookie非常简单的authentication

我有一个网站只打算由3个编码器的私人消费。 这是由nginx直接提供的简单的HTML,但是打算在办公室内外使用。

我想要一个简单的密码或authenticationscheme。 我可以使用HTTP身份validation,但这些往往会相当经常过期,这使得人们使用它很痛苦。 我也紧张,有人比cookies更容易嗅探。

所以我想知道是否可以在JavaScript中使用唯一的长ID在浏览器上设置cookie,并告诉nginx只接受具有此cookie的请求(对于特定的子域)。

这足够简单吗? 我如何

  1. 告诉nginx通过cookie过滤
  2. 在浏览器中,设置一个永不过期的cookie?

要让Nginx过滤cookie,可以在cookie 存在的情况下执行一些操作,然后对3个有权访问的人执行真正的操作,例如:

server { ... if ($http_cookie !~ 'secretvalue') { return 401; } location / { #Auth'd behaviour } } 

要设置永不过期的cookie,请在服务器主机名的页面上启动浏览器的JavaScript控制台,然后输入:

 document.cookie = 'cookie=secretvalue;max-age=3153600000;path=/'; 

这在技术上不是永远的,但100年应该这样做。 如果您非常喜欢,也可以使用RFC1123格式的绝对日期的expires= ,并且可以根据需要轻松调整path

也有浏览器插件,可以让你创建任意的cookie,但所有现代浏览器都有一个JavaScript控制台。

我从Christian Stocker的博客中找到了一个非常简单的解决方案。 它实现了以下规则:

  1. 如果用户在内部IP上,则允许。
  2. 如果用户有一个cookie集,他们是被允许的。
  3. 如果两者都不匹配,则向用户呈现http基本认证,并且如果他们成功认证长期cookie被设置

这真是两全其美。

这是配置:

 map $cookie_letmein $mysite_hascookie { "someRandomValue" "yes"; default "no"; } geo $mysite_geo { 192.168.0.0/24 "yes": #some network which should have access 10.10.10.0/24 "yes": #some other network which should have access default "no"; } map $mysite_hascookie$mysite_geo $mysite_authentication{ "yesyes" "off"; #both cookie and IP are correct => OK "yesno" "off"; #cookie is ok, but IP not => OK "noyes" "off"; #cookie is not ok, but IP is ok => OK default "Your credentials please"; #everythingles => NOT OK } server { listen 80; server_name mysite.example.org; location / { auth_basic $mysite_authentication; auth_basic_user_file htpasswd/mysite; add_header Set-Cookie "letmein=someRandomValue;max-age=3153600000;path=/"; #set that special cookie, when everything is ok proxy_pass http://127.0.0.1:8000/; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $remote_addr; } }