Как использовать файлы cookie в промежуточном программном обеспечении Rack?

Я использую Ruby on Rails 3 и хотел бы использовать метод cookies.signed в промежуточном программном обеспечении Rack. Мне это нужно, потому что я хотел бы аутентифицировать пользователя непосредственно в промежуточном программном обеспечении, а не использовать before_filter в файле application_controller.rb.

Например, если я использую этот метод в контроллере следующим образом:

cookies.signed[:user_id']

я получил

--- 
- 1 # This is the id of the current signed in user
- a64ee3asdtjhcc7b35fcb280956be00ba27f94d48dfe4291c06db7d57577d5893 # This is the cookie salt

но если я использую это в промежуточном программном обеспечении Rack (того же приложения) следующим образом:

request = Rack::Request.new(env)
request.cookies.signed[:user_id']

я получил

NoMethodError
undefined method `signed' for #<Hash:0x00000103333d40>

Итак, как я могу использовать этот метод в промежуточном программном обеспечении? Как я могу получить идентификатор пользователя, чтобы я мог его аутентифицировать?


Может надо включить\расширить, например, ActionDispatch... если да, то как?


person user502052    schedule 17.03.2011    source источник


Ответы (2)


Похоже, вы должны быть в состоянии сделать это:

  request = ActionDispatch::Request.new(env)
  request.cookie_jar.signed[:user_id] #=> 1

Вы можете проверить ... /action_dispatch/middleware/cookies.rb на github, чтобы узнать больше о том, что именно происходит.

person eric    schedule 20.03.2011
comment
Это указало мне правильное направление, но все равно вызвало ту же ошибку (с использованием Rails 4.2.7). Проблема заключалась в отсутствующих секретах приложения в файле env. Замена первой строки на следующую сработала: ActionDispatch::Request.new(Rails.application.env_config.merge(env)). - person jeffcarbs; 23.01.2017

В хэше env присутствует уже инициализированный файл cookie.

env['action_dispatch.cookies'].signed[:user_id]

Пример выше эквивалентен вызову ниже в контексте экземпляра ActionController::Base:

cookies.signed[:user_id]
person Community    schedule 17.01.2013
comment
К сожалению, env['action_dispatch.cookies'] недоступен ни для одного стоечного приложения. Он устанавливается очень поздно при обработке запроса. - person Dmytrii Nagirniak; 18.07.2014