Сеанс Nginx-Lua не запускается с использованием модуля lua-resty-session

У меня есть сервер 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. Я не могу выяснить причину проблемы.


person Vinay Indoria    schedule 10.03.2017    source источник


Ответы (2)


Я автор этого компонента. Я дам вам несколько ответов. Первый ответ, почему вы всегда регистрируете Started --, потому что session.started будет установлено на true только при запуске сеанса. Здесь вы только открываете сессию. Итак, строка:

if not session.started then ... end

всегда будет правдой.

open и start отличаются в том смысле, что open не будет пытаться обновить файл cookie, если срок его действия скоро истечет. И open не начнет новый сеанс, если его нет (session.present). В основном вы используете open только тогда, когда вы не хотите автоматически обновлять файлы cookie, и вам нужен только доступ к нему только для чтения.

Вкратце отвечу, в чем может быть проблема с переподключением сессии (подозреваю, что клиент может не отправить куку обратно, и это может быть из-за каких-то атрибутов куки, пробовали не указывать domain)?

person bungle    schedule 11.03.2017
comment
Привет @bungle, я думаю, проблема решена. Вот последний фрагмент кода, который сработал. local session = session or require "resty.session".start{ secret = "7A7mLtj97p4658r2KahQ6A48awHG2b9d" } Но я застрял с установкой и получением переменной сеанса. Я изучаю это! Большое спасибо. - person Vinay Indoria; 12.03.2017
comment
Я не знаю, что делает эта часть, так как не вижу всего кода. Что это: сессия или...? Вы можете установить переменную сеанса с помощью session.data.variable = value. - person bungle; 13.03.2017
comment
На самом деле я видел кусок кода в lua, который использует переменную d прямо из памяти, а не переназначает ее.. local session = session or require "resty.session".start{ secret = "7A7mLtj97p4658r2KahQ6A48awHG2b9d" }. Во-вторых, я также решил проблему с переменной сеанса. Спасибо! - person Vinay Indoria; 14.03.2017
comment
О, хорошо, глобальная переменная Lua для предотвращения двойного вызова start или что-то в этом роде. - person bungle; 14.03.2017

Пример конфигурации 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-адресу (F5 в Windows, CMD-R на Mac). Теперь клиент отправит этот заголовок на сервер:

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 будет регистрироваться при каждом запросе.

Одно дополнительное примечание:

Как правило, вы не должны устанавливать domain, если вы обращаетесь к (одному) IP-адресу, потому что браузеры по умолчанию отправляют файлы cookie только на тот же IP-адрес, а это означает, что передача домена не имеет большого значения. аргумент в файле cookie.

person bungle    schedule 11.03.2017