ruby-on-rails – 如何允许用户使用注册帐户和Facebook帐户登录?

我使用了devise来允许用户在站点内注册和登录.我还使用omniauth-facebook允许用户使用他们的Facebook帐户登录.但是,首先使用与他们的Facebook电子邮件相同的电子邮件注册的人无法使用他们的Facebook帐户登录.我想同时使用facebook登录和网站注册.

这是我的user.rb

class User < ActiveRecord::Base

  devise :database_authenticatable, :registerable,
     :recoverable, :rememberable, :trackable, :validatable, :omniauthable

  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(name:auth.extra.raw_info.name,
                         provider:auth.provider,
                         uid:auth.uid,
                         email:auth.info.email,
                         password:Devise.friendly_token[0,20]
                         )
    end
    user
  end
end

和omniauth_callbacks_controller.rb

class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController
  def facebook
    @user = User.find_for_facebook_oauth(request.env["omniauth.auth"], current_user)

    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
    end
  end
end

最佳答案 您可以通过以下方式轻松完成此操作:

>使用以下属性创建另一个名为Authorization的模型:

provider:string, uid:string, user_id:integer

>现在,用户将与授权相关联,如下所示:

class User
  has_many :authorizations
  ...
end

>每当发生facebook登录时,请检查授权模型以查看是否存在记录.如果没有创建它并将其链接到用户模型(通过电子邮件ID搜索).
>获取正确的用户对象并使用它进行登录.

资料来源:http://net.tutsplus.com/tutorials/ruby/how-to-use-omniauth-to-authenticate-your-users/

点赞