0

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

在我的 Rails 4 应用程序中,我尝试按照设计和 Omniauth 概述指南将 Omniauth-facebook 与设计集成

我使用我的 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
4

1 回答 1

0

There is no relations to delete, the result is empty. You need to debug to find out why was the new user not saved.

In your controller use the following for debugging:

puts request.env["omniauth.auth"]
puts @user.errors.to_a
于 2014-11-06T11:42:31.627 回答