Rails и Omniauth: Twitter /auth/failure?message=invalid_response

Я использую omniauth для реализации аутентификации Twitter в своем приложении. У меня работает аутентификация в Facebook, и я знаю, где код для аутентификации в 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 => "[email protected]", но все равно получаю тот же результат.


person Ankit Soni    schedule 05.08.2011    source источник


Ответы (1)


Вероятно, линия

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

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

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

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

person Fabio    schedule 05.08.2011