使用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
答案 0 :(得分:0)
没有删除关系,结果为空。您需要进行调试以找出未保存新用户的原因。
puts request.env["omniauth.auth"]
puts @user.errors.to_a