Rails & Omniauth: Twitter / auth / fail? Message = invalid_response - PullRequest
0 голосов
/ 05 августа 2011

Я использую omniauth для реализации аутентификации Twitter в моем приложении. У меня работает аутентификация на фейсбуке, и я знаю, где код для аутентификации на твиттере не работает, но я не могу понять, почему!

Twitter не предоставляет адрес электронной почты, и мой сайт аутентифицируется на основе электронной почты / pw, поэтому я разрешаю пользователям только добавлять учетную запись Twitter в уже существующую учетную запись, созданную путем регистрации на сайте или через Facebook.

Это соответствующий код, часть моего services_controller.rb:

logger.info("USER SIGNED IN")
auth = Service.find_by_provider_and_uid(provider, uid)
logger.info("AUTH: #{auth}")
#If user is signed in but does not have this service linked to his account
if !auth
  logger.info("AUTH IS NULL, SERVICE NOT LINKED TO ACCOUNT")
  logger.info("PROVIDER: #{provider}, UID: #{uid}, EMAIL: #{email}")
  user.services.create!(:provider => provider, :uid => uid, :uemail => email)
  logger.info("SERVICE CREATED")
  flash[:notice] = 'Sign in via ' + provider.capitalize + ' has been added to your account.'
  redirect_to services_path

Теперь, последнее, что я вижу в своем журнале:

AUTH IS NULL, SERVICE NOT LINKED TO ACCOUNT
PROVIDER: twitter, UID: 3195xxxxx, EMAIL: 
Completed   in 231ms
Started GET "/auth/failure?message=invalid_response" for 127.0.0.1 at 2011-08-05 20:52:30 +0530
ActionController::RoutingError (No route matches "/auth/failure"):

Как видно из приведенного выше кода, это означает, что строка user.services.create!(...) не срабатывает, поэтому я никогда не вижу SERVICE CREATED в своем журнале. Я не знаю, почему это терпит неудачу все же. Я знаю, что переменная email пуста, но это ожидаемо, поскольку Twitter не предоставляет электронные письма. Я даже пытался заменить :uemail => email на :uemail => "validemail@gmail.com", но все равно получаю тот же вывод.

1 Ответ

1 голос
/ 05 августа 2011

Возможно, строка

user.services.create!(:provider => provider, :uid => uid, :uemail => email)

вызывает исключение, поэтому следующий код не выполняется.Вы пробовали эту строку с помощью консоли?

Может быть, это может быть ошибка проверки, что-то вроде validate_uniqueness или validates_presence_of.Это может быть дубликат uid в таблице служб.

Выполнение этой строки из консоли даст вам ответ.

...