Сеанс Sinatra не сохраняется на Post

#ruby #nginx #sinatra #session-cookies #puma

#ruby #nginx #sinatra #файлы cookie сеанса #puma

Вопрос:

В настоящее время я запускаю приложение sinatra, используя puma и обратный прокси-сервер nginx. Сеансы и файлы cookie сохраняются нормально при любых запросах get, как видно из регистрации:

 {"user_id"=>1, "session_id"=>"89bb966142230a06fb5103db746c3011a741d88c7759dc2bff00c6bdd597c946"}
  

Идентификатор пользователя, являющийся важной частью, которая означает, что сеанс сохранил свою информацию. Однако, как только я пытаюсь опубликовать через форму, я вместо этого теряю эту важную информацию:

 "POST /price HTTP/1.0" 302 - 0.0045
{"session_id"=>"89bb966142230a06fb5103db746c3011a741d88c7759dc2bff00c6bdd597c946"}
  

Моя конфигурация sinatra для сеансов:

 use Rack::Session::Cookie, :key => 'rack.session',
                       :path => '/',
                       :secret => ENV['secret']
  

Который, похоже, отлично работает во всех других сценариях приложения.

Мои настройки обратного прокси-сервера Nginx для этого приложения следующие:

 server {
  root /var/www/app/public;
  access_log /var/www/app/var/log/nginx_access.log;
  error_log /var/www/app/var/log/nginx_error.log;


  location / {
    try_files $uri @app;
  }

  location @app {
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_pass http://admin_server;
    proxy_pass_request_headers on;
    proxy_cookie_domain localhost $http_host;
  }

  #certbot ssl stuff
}
  

Сейчас я в относительной растерянности, поскольку все остальные аспекты проверки подлинности и сохранения сеанса, похоже, работают нормально, но сообщение формы разваливается. Любые рекомендации и помощь были бы чрезвычайно полезны!

Комментарии:

1. Возможно ли, что вы столкнулись с механизмом защиты CSRF (подделка межсайтовых запросов)? Не уверен, как это работает в Sinatra, но вы, возможно, пропустили добавление скрытого поля маркера подлинности в вашей форме.

2. Возникает ли проблема при публикации непосредственно в приложении, а не через Nginx? Было бы полезно устранить это как источник проблемы.