Я имею в виду эти railscasts для реализации входа с использованием twitter, omniauth и devise:
- http://railscasts.com/episodes/235-omniauth-part-1?view=asciicast
- 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 ???