Стратегия разработчика omniauth rails 4 – ошибка при обратном вызове – ActionController::InvalidAuthenticityToken в SessionsController#create

c9 ide, рабочее пространство Ubuntu, rails 4.2.10, ruby ​​2.4.0

При попытке использовать omniauth gem в режиме разработчика со стратегией разработчика ссылка для входа в 'auth/developer' успешно представляет форму пользователю. При отправке формы (где маршрут 'auth/developer/callback') генерируется эта ошибка:

ActionController::InvalidAuthenticityToken in SessionsController#create 

Хотелось бы иметь возможность использовать стратегию разработчика в оставшейся части разработки приложения. Документация, похоже, не указывает ничего другого, необходимого для обратного вызова при использовании стратегии разработчика (в режиме разработки). Кажется, в документе есть по крайней мере одно небольшое несоответствие, чего-то не хватает?

Весь код работает правильно при использовании реальных провайдеров или в тестовом режиме с огурцом. Вот часть кода инициализатора (не включая ключи/секреты), с которого я начал в config/initializers/omniauth.rb:

OmniAuth.config.logger = Rails.logger
Rails.application.config.middleware.use OmniAuth::Builder do
  provider :developer unless Rails.env.production?
  provider :github, 'redacted,'redacted',
         { :name => "github", :scope => ['read:user','user:email']}
  provider :facebook, 'redacted', 'redacted'  
end

Gemfile включает в себя:

gem 'omniauth'
gem 'omniauth-github'
gem 'omniauth-facebook'

маршруты.rb:

match 'auth/:provider/callback', :to => 'sessions#create', :via => [:get, :post]

session_controller:

 def create
    begin
      authenticator = Authentication.new(env["omniauth.auth"])
      authenticator.disallow(session[:user_id]) if session?
      authenticator.deny if authenticator.missing_information?
      auth, message = authenticator.register_or_login
      session[:user_id] = auth.user.id
etc.

приложение/контроллеры/sessions_controller/authentication.rb:

  def initialize(omniauth)
      # get Omniauth authentication hash
      @auth_hash = omniauth
  end

  def auth_hash
      @auth_hash 
  end
etc.

В случае успеха (с использованием других провайдеров или в тестовом режиме) обратный вызов должен быть обеспечен действительным токеном, после чего путь кода можно легко проследить через метод создания session_controller к конструктору класса Authenticator и т. д.

В режиме разработки с использованием стратегии разработчика тело метода создания сеансов вообще никогда не вводится.

После получения действительного токена я должен увидеть такие сообщения, как:

"Welcome <name> You've signed up via <provider>."

Однако, поскольку ошибка возникает до этого момента, в выводе сервера вы увидите только следующее:

Processing by SessionsController#create as HTML
  Parameters: {"name"=>"Example User", "email"=>"[email protected]", "provider"=>"developer"}
Can't verify CSRF token authenticity
Completed 422 Unprocessable Entity in 1ms (ActiveRecord: 0.0ms)

ActionController::InvalidAuthenticityToken (ActionController::InvalidAuthenticityToken):
  actionpack (4.2.10) lib/action_controller/metal/request_forgery_protection.rb:181:in `handle_unverified_request'

person user5803589    schedule 07.05.2019    source источник


Ответы (1)


Я нашел это в другом разделе Wiki: сеанс Rails прерывается после обратного вызова в стратегии разработчика. Обратный вызов стратегии разработчика отправляется с использованием запроса POST. Отключить защиту от подделки для данного действия, иначе сессия будет затираться рельсами.

skip_before_action :verify_authenticity_token, только: :create

Это определенно работает, но у меня все еще есть несколько вопросов. Определяется ли и обрабатывается ли действие before_action самим omniauth, или я должен добавить его в свои контроллеры, когда НЕ в режиме разработчика?
Похоже, что эта схема работает, просто добавляя эту строку в режиме разработчика и удаляя ее в рабочей среде, что кажется довольно ненадежным. Есть ли способ применить его автоматически?

person user5803589    schedule 08.05.2019