即使在使用Devise和Omniauth删除用户之后,提供者和uid是否存储在某处?

时间:2014-11-06 08:51:11

标签: ruby-on-rails facebook devise omniauth-facebook

使用Devise和Omniauth删除用户后,提供者和uid是否存储在另一个表中?

在我的Rails 4应用程序中,我试图将Omniauth-facebook与Devise集成,跟随Devise and Omniauth Overview Guide

我使用我的Facebook帐户成功登录(并创建了一个帐户)。然后作为另一个管理员用户,我删除了用于注册Facebook的帐户。

我尝试使用相同的Facebook帐户登录Facebook(重新创建我的帐户),这次我被重定向到常规电子邮件注册页面。

我进入了Rails控制台并检查是否有任何用户使用我的Facebook提供商和UID并找到了一个对象ActiveRecord::Relation

2.1.3 :001 > user = User.where(provider: "facebook", uid: 'MYFACEBOOKUID')
  User Load (0.5ms)  SELECT "users".* FROM "users"  WHERE "users"."provider" = 'facebook' AND "users"."uid" = 'MYFACEBOOKUID'
 => #<ActiveRecord::Relation []> 

我相信当我使用Facebook删除帐户时,此ActiveRecord :: Relation未被销毁。现在它阻止我注册我的Facebook帐户。

如何删除此关系?

我的用户模型:

class User < ActiveRecord::Base
  rolify before_add: :before_add_method
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable,
         :omniauthable, :omniauth_providers => [:facebook]

   before_create :set_default_role

   def self.from_omniauth(auth)
     where(provider: auth.provider, uid: auth.uid).first_or_create do |user|
       user.email = auth.info.email
       user.password = Devise.friendly_token[0,20]
       user.first_name = auth.info.first_name
       user.last_name = auth.info.last_name
       user.username = auth.info.nickname
       user.facebook_page = auth.extra.raw_info.link
       user.gender = auth.extra.raw_info.gender
     end
   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?
          user.first_name = data["first_name"] if user.first_name.blank?
          user.last_name = data["last_name"] if user.last_name.blank?
          user.valid?
          # user.email = data["email"] if user.email.blank?
        end
      end
    end

   private

   def before_add_method(role)
    # do something before it gets added
   end

   def set_default_role
     if User.count == 0
       self.add_role :admin
     else
       self.add_role :user unless User.count == 0
     end
   end

end

1 个答案:

答案 0 :(得分:0)

没有删除关系,结果为空。您需要进行调试以找出未保存新用户的原因。

在您的控制器中,使用以下命令进行调试:

puts request.env["omniauth.auth"]
puts @user.errors.to_a