18

我有一个仅供 3 位程序员私人使用的网站。它是由 nginx 直接提供的简单 HTML,但旨在供办公室内外使用。

我想要一个简单的密码或身份验证方案。我可以使用 HTTP 身份验证,但这些往往会经常过期,这让人们使用起来很痛苦。我也很紧张,有人闻比饼干更容易闻。

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

这足够简单吗?我如何能

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

2 回答 2

20

我从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;
  }
}
于 2017-08-15T12:02:06.203 回答
15

要让 Nginx 通过 cookie 过滤,如果 cookie存在,您可以执行一些操作,然后对 3 个有权访问的人执行实际操作,例如:

server {
    listen 443 ssl http2;  # Use HTTPS to protect the secret
    ...
    if ($http_cookie !~ 'secretvalue') {
        return 401; 
    }
    location / {
       # Auth'd behaviour goes here
    }
}

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

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

从技术上讲,这不是永远的,但应该 100 年才能做到。如果您愿意,也可以使用expires=RFC1123 格式的绝对日期,并且可以path根据需要轻松调整。这也会secure在 cookie 上设置标志,因此它只会通过 HTTPS 发送。

还有一些浏览器插件允许您创建任意 cookie,但所有现代浏览器都有一个 JavaScript 控制台。

于 2014-04-16T14:33:21.397 回答