rails 4 omniauth developer стратегии - ошибка при обратном вызове - ActionController :: InvalidAuthenticityToken в SessionsController # create - PullRequest
1 голос
/ 07 мая 2019

c9 ide, рабочая область Ubuntu, рельсы 4.2.10, ruby ​​2.4.0

При попытке использовать гем omniauth в режиме разработчика со стратегией разработчика, ссылка для входа в систему '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'

routes.rb:

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

sessions_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.

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

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

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

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

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

Processing by SessionsController#create as HTML
  Parameters: {"name"=>"Example User", "email"=>"example@user.com", "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'

1 Ответ

1 голос
/ 08 мая 2019

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

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

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

...