2012-11-15 41 views
3

即使omniauth控制器確認登錄成功,我仍然無法從用戶數據庫中保存用戶。我跟着從omniauth維基的說明:https://github.com/plataformatec/devise/wiki/OmniAuth%3A-Overview從Devise通過Omniauth成功登錄後,用戶不存儲在數據庫中(Rails 3)

user.rb:

class User < ActiveRecord::Base 
# Include default devise modules. Others available are: 
# :token_authenticatable, :confirmable, 
# :lockable, :timeoutable and :omniauthable 
    devise :database_authenticatable, :registerable, :recoverable, :rememberable, :trackable, :validatable, :omniauthable 
# Setup accessible (or protected) attributes for your model 
attr_accessible :email, :encrypted_password, :provider, :uid 
attr_accessor :email, :password, :password_confirmation, :remember_me, :provider, :uid, :name 

def self.from_omniauth(auth) 
where(auth.slice(:provider, :uid)).first_or_initialize.tap do |user| 
user.provider = auth.provider 
user.uid = auth.uid 
user.email = auth.info.email 
user.encrypted_password = Devise.friendly_token[0,20] 
user.save! 
end 
end 



def self.find_for_facebook_oauth(auth, signed_in_resource=nil) 
    user = User.where(:provider => auth.provider, :uid => auth.uid).first 
    unless user 
    user = User.create(
         provider:auth.provider, 
         uid:auth.uid, 
         email:auth.info.email, 
         encrypted_password:Devise.friendly_token[0,20] 
         ) 
    #user.ensure_authentication_token! 
    #added extra to create authentication for user 
    user.save 
    end 
    user 
end 

def self.new_with_session(params, session) 
super.tap do |user| 
    if data = session["devise.facebook_data"] && session["devise.facebook_data"]["extra"]["raw_info"] 
    user.email = data["email"] if user.email.blank? 
    end 
end 
end 
end 

omniauth_callback_controller.rb:

class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController 

def passthru 
render :file => "#{Rails.root}/public/404.html", :status => 404, :layout => false 
# Or alternatively, 
# raise ActionController::RoutingError.new('Not Found') 
end 

def facebook 
# You need to implement the method below in your model (e.g. app/models/user.rb) 
@user = User.find_for_facebook_oauth(request.env["omniauth.auth"], current_user) 
#@user = User.from_omniauth(request.env["omniauth.auth"]) 

if @user.persisted? 
    sign_in_and_redirect @user, :event => :authentication #this will throw if @user is not activated 
    set_flash_message(:notice, :success, :kind => "Facebook") if is_navigational_format? 
else 
    session["devise.facebook_data"] = request.env["omniauth.auth"] 
    #redirect_to new_user_registration_url 
    redirect_to messages_url 
end 
end 
end 

我試着登錄使用默認色器件控制器和它去通過用戶數據庫。因爲我不能存儲到數據庫,我不能也得到uid。

回答

1

通過從不同的方法創建一個新的應用程序:http://supriya-surve.blogspot.com/2012/06/rails-3-devise-omniauth-facebook.html,我找到了解決方案。

更新user.rb find_for_facebook_auth:

def self.find_for_facebook_oauth(auth, signed_in_resource=nil) 
    user = User.where(:provider => auth.provider, :uid => auth.uid).first 
    unless user 
    user = User.create(
         provider:auth.provider, 
         uid:auth.uid, 
         email:auth.info.email, 
         password:Devise.friendly_token[0,20] 
         ) 

    end 
    user 
end 

然後user.rb的attr_accessible:

attr_accessible :email, :password, :password_confirmation, :remember_me, :provider, :uid, :oauth_token, :oauth_expires_at 

成功登錄後,用戶保存到數據庫中。

0

我也had the same problem當我決定添加Tumblr身份驗證到現有的Devise用戶模型。原來,Devise在index_users_on_email數據庫索引中拋出了一個錯誤。

網絡上沒有人有這個問題,所以我想我會把它扔在那裏。我花了很長時間試圖弄清楚。很高興你解決了:)

相關問題