1

我有一个 nginx 服务器,用作转发代理。我想为架构添加一层身份验证,并且我正在使用 Lua。

我正在使用https://github.com/bungle/lua-resty-session模块在 lua 中启用会话。

local session = require "resty.session".open{ cookie = { domain =  cookie_domain } }
-- Read some data
if session.present then
   ngx.log(ngx.ERR, "Session -- "..session.id)
end
if not session.started then 
   session:start()
   ngx.log(ngx.ERR, "Started -- ")
end

在服务器上收到每个请求后,我都会收到日志消息

开始——

服务器配置:

server {
        listen 80;
        server_name {SERVER_IP};
        # tons of pagespeed configuration
        location / {
                #basic authentication
                ##auth_basic "Restricted";
                ##auth_basic_user_file {PATH_FOR_HTPASS_FILE};
                access_by_lua_file {PATH_FOR_LUA_FILE};

                # cache name
                proxy_cache browser_cache;

                resolver 8.8.8.8;
                # app1 reverse proxy follow
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header Host $host;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_pass http://$http_host$uri$is_args$args;
        }
}

我看到的唯一问题是 cookie_domain,服务器没有指向域,我将服务器的IP 地址作为cookie_domain传递。我无法找出问题的原因。

4

2 回答 2

3

我是该组件的作者。我会给你几个答案。第一个答案,为什么你总是被Started --记录是因为只有在你开始会话session.started时才会设置为。true在这里您只打开会话。所以这一行:

if not session.started then ... end

永远都是真的。

open并且start在这个意义上是不同的,open如果它即将过期,它不会尝试更新cookie。如果不存在( ) ,open则不会开始新会话。session.present基本上,只有在您不想自动更新 cookie 并且您只想要只读访问它时才使用 open 。

我将很快回答可能导致重新连接会话的问题(我怀疑客户端可能没有将 cookie 发回,可能是因为某些 cookie 属性,您是否尝试过不指定domain)?

于 2017-03-11T15:28:40.530 回答
1

示例 Nginx 配置:

server {
    listen 8090;
    server_name 127.0.0.1;
    location / {
        access_by_lua_block {
            local session = require "resty.session".open{
                cookie = { domain = "127.0.0.1" }
            }
            if session.present then
                ngx.log(ngx.ERR, "Session -- " .. ngx.encode_base64(session.id))
            else
                session:start()
                ngx.log(ngx.ERR, "Started -- " .. ngx.encode_base64(session.id))
            end
        }
        content_by_lua_block {
            ngx.say "Hello"
        }
    }
}

现在打开一个带有 url http://127.0.0.1:8090/的浏览器。

服务器将向您发送此标头:

Set-Cookie:
       session=acYmlSsZsK8pk5dPMu8Cow..|
       1489250635|
       lXibGK3hmR1JLPG61IOsdA..|
       RdUK16cMz6c3tDGjonNahFUCpyY.;
       Domain=127.0.0.1;
       Path=/;
       SameSite=Lax;
       HttpOnly

这将记录在您的 Nginx 中error.log

2017/03/11 17:43:55 [error] 1100#0: *2
[lua] access_by_lua(nginx.conf:21):7:
Started -- acYmlSsZsK8pk5dPMu8Cow==,
client: 127.0.0.1,
server: 127.0.0.1,
request: "GET / HTTP/1.1",
host: "127.0.0.1:8090"

正是我们想要的。现在通过转到相同的 url(Windows 上的 F5,Mac 上的 CMD-R)刷新浏览器。现在客户端会将这个标头发送到服务器:

Cookie: session=acYmlSsZsK8pk5dPMu8Cow..|
      1489250635|
      lXibGK3hmR1JLPG61IOsdA..|
      RdUK16cMz6c3tDGjonNahFUCpyY.

一切都还刚刚好。这被记录到 Nginx error.log

2017/03/11 17:51:44 [error] 1100#0: *3
[lua] access_by_lua(nginx.conf:21):4:
Session -- acYmlSsZsK8pk5dPMu8Cow==,
client: 127.0.0.1,
server: 127.0.0.1,
request: "GET / HTTP/1.1",
host: "127.0.0.1:8090"

看,这里没有记录Started

另请阅读: https ://github.com/bungle/lua-resty-session#notes-about-turning-lua-code-cache-off

如果你有:lua_code_cache off;那么你需要设置,secret否则secret每个请求都会重新生成不同的,这意味着我们将永远无法附加到以前打开的会话,这意味着Started将记录每个请求。

附加说明:

一般来说,如果您正在访问(单个)IP 地址,则不应设置domain,因为默认情况下,浏览器只会将 cookie 发送回相同的 IP 地址,这意味着传递域参数并不重要在饼干里。

于 2017-03-11T16:00:24.627 回答