Придумайте Omniauth, как связать аккаунт гугл - PullRequest
3 голосов
/ 15 сентября 2011

Я настроил устройство для работы с omniauth и. Вот так выглядит devise.rb:

...
  config.omniauth :facebook, FACEBOOK_APP_ID, FACEBOOK_APP_SECRET, :scope => FACEBOOK_APP_PERMISSIONS
  config.omniauth :openid, OpenID::Store::Filesystem.new('./tmp'), :name => 'yahoo', :identifier => 'yahoo.com'
  config.omniauth :openid, OpenID::Store::Filesystem.new('./tmp'), :name => 'gmail', :identifier => 'https://www.google.com/accounts/o8/id'
...

Я хочу связать существующую учетную запись с вышеуказанными 3, используя следующий код из контроллера обратного вызова:

...
  def callback(provider)
    if utilizator_signed_in?
      # link it's account
      if Login.link_omniauth(current_utilizator, omniauth_data)
        flash[:notice] = I18n.t "devise.omniauth_callbacks.link.success", :kind => provider
        redirect_to :root
      end
    else
      utilizator = Login.auth_with_omniauth(omniauth_data)

      if !utilizator.nil?
        flash[:notice] = I18n.t "devise.omniauth_callbacks.success", :kind => provider
        sign_in_and_redirect utilizator, :event => :authentication
      else
        utilizator = Login.register_omniauth(omniauth_data)
        flash[:notice] = I18n.t "devise.omniauth_callbacks.register.success", :kind => provider
        sign_in_and_redirect utilizator, :event => :authentication
      end
    end
  end
...

Он отлично работает с Facebook, но для Google и Yahoo текущий пользователь вышел из системы и создан новый пользователь.

Как я могу пропустить фазу выхода пользователя?

Спасибо,

Edit: Я использую последнюю версию 3.0.rc3. Функции из Login легко угадать: link_omniauth - свяжет текущего зарегистрированного пользователя с учетной записью auth_with_omniauth - авторизует пользователя register_omniauth - зарегистрирует нового пользователя

Проблема здесь в том, что utilizator_signed_in? (user_signed_in?) вернет false для Google, когда пользователь вошел в систему, я думаю, что произошел предыдущий выход из системы, который не происходит для Facebook.

Ответы [ 2 ]

3 голосов
/ 29 сентября 2011

Я очень рекомендую этот урок: здесь (гораздо более детальный, чем уроки по рельсам и другие уроки по теме). В частности, он имеет полный 200-строчный код (services_controller.rb) для создания контроллера, который вам понадобится для эффективной обработки любой службы аутентификации (Twitter / Facebook / Google / Github) с использованием Omniauth, а также для привязки его к существующие учетные записи Devise или создание новых учетных записей.

У меня есть (почти) живой проект с этим здесь - Вы можете войти в систему через Facebook / Twitter (пока я не включил google / github), и если вы войдете в Profile-> Services после входа в систему, он покажет вам несколько служб аутентификации, связанных с вашей учетной записью.

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

2 голосов
/ 29 сентября 2011

Итак, я наконец-то нашел ответ на свой вопрос. У этого парня https://github.com/intridea/omniauth/issues/185 была та же проблема.

Спасибо за ваши ответы,

...