Внедрение входа с использованием Twitter, Omniauth и Devise

Я имею в виду эти railscasts для реализации входа с использованием twitter, omniauth и devise:

  1. http://railscasts.com/episodes/235-omniauth-part-1?view=asciicast
  2. http://railscasts.com/episodes/236-omniauth-part-2?view=asciicast

Сценарий. Пользователь Twitter заходит в мое приложение. Щелкает по ссылке Twitter для входа и переходит в /auth/twitter. Он разрешает мое приложение на сайте Twitter и перенаправляется обратно в мое приложение. Он вводит свой адрес электронной почты на моем сайте, так как это обязательно. Он использует сайт, а затем выходит из моего приложения. Затем он снова хочет войти в систему. Он снова нажимает на значок входа в Твиттер. Моя проблема: я ожидал, что ему не придется снова авторизовывать мое приложение на сайте Twitter. Но это не тот случай. На этот раз твиттер снова просит этого пользователя авторизоваться.

Мой код точно следует за railscasts:

 <routes.rb>
 match '/auth/:provider/callback' => 'authentications#create'


class AuthenticationsController < ApplicationController
...
def create
    omniauth = request.env["omniauth.auth"]

    authentication = Authentication.find_by_provider_and_uid(omniauth['provider'], omniauth['uid'])

    if authentication
      flash[:notice] = "Signed in successfully."
      sign_in_and_redirect(:user, authentication.user)
    elsif current_user
      current_user.authentications.create(:provider => omniauth['provider'], :uid => omniauth['uid'])
      flash[:notice] = "Authentication successful."
      redirect_to authentications_url
    else
      user = User.new
      user.apply_omniauth(omniauth)
      if user.save
        flash[:notice] = "Signed in successfully."
        sign_in_and_redirect(:user, user)
      else
        session[:omniauth] = omniauth.except('extra')
        redirect_to new_user_registration_url
      end
    end
  end
...
end

Пользовательская модель от Devise изменена как:

class User < ActiveRecord::Base
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable

  # Setup accessible (or protected) attributes for your model
  attr_accessible :email, :password, :password_confirmation, :remember_me
  has_many :authentications

    def apply_omniauth(omniauth)
        authentications.build(:provider => omniauth['provider'], :uid => omniauth['uid'])
    end

    def password_required?
        (authentications.empty? || !password.blank?) && super
    end
end

Что мне нужно сделать, чтобы возвращающегося пользователя не просили авторизовать мое приложение каждый раз, когда он/она перенаправляется на /auth/twitter ???


person Jayant Varma    schedule 19.03.2012    source источник
comment
И мой инициализатор omniauth выглядит так: «Rails.application.config.middleware.use OmniAuth::Builder do provider :twitter, ***********************, *********************** конец'   -  person Jayant Varma    schedule 19.03.2012


Ответы (2)


Я решил это с помощью этого ответа:

Rails omniauth — твиттер запрашивать авторизацию приложения каждый раз, когда пользователь входит в систему

Вы должны добавить хеш client_options.

person user1294122    schedule 26.03.2012

если вы будете следовать рассказам Райана Бейтса о devise и omniauth, ваша пользовательская модель должна иметь ассоциации между пользователем и аутентификацией.

Пользовательской модели нужно что-то вроде этого: has_many :authentications

Вашему файлу route.rb также нужен ресурс:

match '/auth/:provider/callback' => 'аутентификации#создать'

devise_for :users, :controllers => {:sessions => 'сеансы', :registrations => 'регистрации'}

ресурсы: аутентификации

Надеюсь, это поможет.

С уважением Ян

person Jan Otterstetter    schedule 26.03.2012