Devise/Omniauth failure: как отладить его?

После попытки "войти в систему с Google" я вижу эту ошибку в журналах:

Processing by Users::OmniauthCallbacksController#failure as HTML

Я могу видеть все данные из Google, отправленные через URL (в журналах), включая электронную почту и имя пользователя. Так что может пойти не так? Мои обратные вызовы даже не выполняются. Я только перенаправляюсь на страницу sign_in моего сайта.

И я уверен, что все настроено правильно, потому что это работало нормально несколько недель назад. Я не думаю, что я что-то изменил. Вход в Facebook по-прежнему отлично работает.

Любые идеи о том, как отладить этот сбой? В журналах больше ничего нет, кроме тех длинных URL, которые полны параметров и значений. Только сообщения INFO. Один, вышедший выше, является единственным, кто сказал что-то об отказе.

UPDATE

Я добавил контроллер ""

def failure
  render :text => params.inspect
end

Что остановило перенаправления и напечатало это:

{}

URL был следующим:

/users/auth/google/callback?_method=post&openid.ns=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0&openid.mode=id_res&openid.op_endpoint=https%3A%2F%2Fwww.google.com%2Faccounts%2Fo8%2Fud&openid.response_nonce=2012-04-16T12%3A25%3A49Z_v1fNngSQJaHBQ&openid.return_to=http%3A%2F%2Fdev.myapp.me%3A3000%2Fusers%2Fauth%2Fgoogle%2Fcallback%3F_method%3Dpost&openid.assoc_handle=AMlYA9Urw_lYamPphTSdQ9a6DU0Ez0y5RaDDM78qPL7Xgm77nMpJiB85&openid.signed=op_endpoint%2Cclaimed_id%2Cidentity%2Creturn_to%2Cresponse_nonce%2Cassoc_handle%2Cns.ext1%2Cext1.mode%2Cext1.type.ext5%2Cext1.value.ext5%2Cext1.type.ext8%2Cext1.value.ext8%2Cext1.type.ext2%2Cext1.value.ext2&openid.sig=2FPjo7U1e%2Fde248XpUgjQLduNAM%3D&openid.identity=https%3A%2F%2Fwww.google.com%2Faccounts%2Fo8%2Fid%3Fid%3DAItOawk1F5U6x_-kJnydjoww5haU41tquh1Zl2c&openid.claimed_id=https%3A%2F%2Fwww.google.com%2Faccounts%2Fo8%2Fid%3Fid%3DAItOawk1F5U6x_-kJnydjoww5haU41tquh1Zl2c&openid.ns.ext1=http%3A%2F%2Fopenid.net%2Fsrv%2Fax%2F1.0&openid.ext1.mode=fetch_response&openid.ext1.type.ext5=http%3A%2F%2Faxschema.org%2FnamePerson%2Ffirst&openid.ext1.value.ext5=Some_User&openid.ext1.type.ext8=http%3A%2F%2Faxschema.org%2Fcontact%2Femail&openid.ext1.value.ext8=some_email%40gmail.com&openid.ext1.type.ext2=http%3A%2F%2Faxschema.org%2FnamePerson%2Flast&openid.ext1.value.ext2=Some_User

Итак, все, что мне нужно, - это URL, но dev//omniauth не захватывает его (и, видимо, почему он вызывает метод "отказ" вместо моих обратных вызовов). Я не знаю, должен ли он быть доступен через массив params, или что.

Я также заинтригован частью ?_method=post, потому что все запросы на мой сайт - это запросы GET. Возможно, это просто означает, что запрос, сделанный omniauth для google, был POST.

Любые мысли?

Ответ 1

Чтобы ответить на исходный вопрос о том, как вы отлаживаете Omniauth, здесь, как включить ведение журнала для Omniauth. Добавьте эту строку в config/initializers/devise.rb сразу после определения стратегий Omniauth:

OmniAuth.config.logger = Rails.logger if Rails.env.development?

(Если вы не используете Devise, просто Omniauth, а затем добавьте код вместо config/initializers/omniauth.rb)

В вашем файле журнала вы получите больше информации от Omniauth, включая полный ответ на этапе обратного вызова.

Ответ 2

Я знаю, что это старый вопрос, но у меня была такая же проблема, и ничего не нашел в сети. Оказывается, проблема была вызвана тем, как я использовал Puma (практика перешла от Thin). Я запускал несколько процессов Puma на одном компьютере (обратный прокси Apache), и, похоже, обратный звонок из Github перешел на другой процесс Puma, чем исходный запрос аутентификации. Я взял процессы Puma до одного и не получил условие снова (переключился на использование рабочих Puma: puma -w 5, который, в свою очередь, использует процессы, управляемые Puma вместо Apache round robin), Именно поэтому я никогда не сталкивался с проблемой в разработке, потому что я не запускаю кластер процессов в этой среде.

Ответ 3

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

Мне удалось решить это, так что вот для следующего человека, который ищет его.

Это оказалось тривиальным. Это то, что у меня было:

# config/initializers/omniauth.rb
Rails.application.config.middleware.use OmniAuth::Builder do
  provider :github, ENV['github_key'], ENV['github_secret']
end

# config/initializers/devise.rb
Devise.setup do |config|
  # ... devise config not related to omniauth ...
  config.omniauth :github, ENV['github_key'], ENV['github_secret']
end

Итак, я настраивал провайдера omniauth в двух местах, и это противоречиво.

После удаления конфигурации из omniauth.rb запрос перенаправления от github до /auth/github/callback начал обрабатываться Users::OmniauthCallbacksController#github вместо #failure, как и ситуация до изменения.

Такая тупая ошибка и так мало информации для работы с...

Ответ 4

Вы недавно обновили свои драгоценные камни? Если это так, было бы полезно сравнить omniauth и разработать версии с предыдущими версиями gem. Это также может быть изменением omniauth/devise.

Я не совсем уверен, что проблема в этом конкретном случае, но если вы хотите глубоко понять код, тогда установите жучок pry-debug. Он дает вам интерфейс pry с шагами и следующими командами отладки. Добавьте pry.binding в свой код, и он остановит выполнение на сервере и вызовет интерфейс pry. Например:

def failure
  binding.pry
  render :text => params.inspect
end