【问题标题】:Facebook & Google Omniauth & Rails app with authFacebook 和谷歌 Omniauth 和 Rails 应用程序与 auth
【发布时间】:2016-08-16 19:00:08
【问题描述】:

我正在尝试让我的用户通过 Facebook、Google 或用户表单登录。我在 web 和 stackoverflow 上搜索了几个主题。但是我还是有一个小问题想不通。

我有一个用户必须填写的用户表单;

name
username
email
password
password_confirmation

然后我创建了另一个名为identity 的模型。 看起来像这样;

class Identity < ActiveRecord::Base
    belongs_to :user
    validates_presence_of :user_id, :uid, :provider
    validates_uniqueness_of :uid, :scope => :provider


 def self.find_from_hash(auth)
    find_by_provider_and_uid(auth.provider, auth.uid)
 end

 def self.create_from_hash(auth, user = nil)
    user ||= User.create_from_hash!(auth)
    Identity.create(:user => user, :uid => auth.uid, :provider => auth.provider, :oauth_token => auth.credentials.token, :oauth_expires_at => Time.at(auth.credentials.expires_at))
 end


end

在会话控制器中,我创建了用户表单;

def create
    user = User.find_by(email: params[:session][:email].downcase)


    respond_to do |format|
    if user && user.authenticate(params[:session][:password])
      if user.admin?
        log_in user
        format.html { redirect_to admin_dashboard_path }
      elsif user.activated? 
        log_in user
        unread_conversation
        params[:session][:remember_me] == '1' ? remember(user) : forget(user)
        format.html { redirect_back_or user }
        flash[:notice] = t('flash.sessions.create.success.html')
        format.js 
      else
        format.html { redirect_to root_url }
        format.json { render json: {email:[t('header.n_activated')]} , status: :unprocessable_entity}
        format.js   { render json: {email:[t('header.n_activated')]}, status: :unprocessable_entity }

      end

    else
    format.html { redirect_to root_url }
    format.json { render json: {email: [t('header.invalid_combination')]} , status: :unprocessable_entity }
    format.js   { render json: {email: [t('header.invalid_combination')]}, status: :unprocessable_entity }

    end
  end


  end

我还有fbcreate 操作,我在其中处理 Facebook 和 Google 登录。

def fbcreate

  identity = env["omniauth.auth"]
  unless @identity = Identity.find_from_hash(identity)
    # Create a new user or add an auth to existing user, depending on
    # whether there is already a user signed in.
    #user = User.find_by_email(identity.info.email)
    @identity = Identity.create_from_hash(identity, current_user)
  end
    log_in @identity.user
    redirect_to root_url
end

在会话助手中,我有 current_user 操作;

def current_user
    if (user_id = session[:user_id])
      @current_user ||= User.find_by(id: user_id)
    elsif (user_id = cookies.signed[:user_id])
      user = User.find_by(id: user_id)
      if user && user.authenticated?(:remember, cookies[:remember_token])
        log_in user
        @current_user = user
      end
    end
  end

在user.rb中

#Social media login
    def self.create_from_hash!(auth)
      create(:name => auth.info.name, :username => auth.info.name.partition(" ").first, :email => auth.info.email, :user_type => 'Personal Account', :password => auth.uid, :activated => true )

好的。所以我的问题是;

  1. 我在 facebook 上有一个电子邮件地址 demo1@gmail.com,在 google 上有一个 demo2@gmail.com。怎么能理解这些邮件是同一个人呢?

  2. 当我使用表单注册时,我给我的 facebook 电子邮件 demo1@gmail.com 然后我想将 facebook 和 google 附加到这个用户。

fbcreate 操作中的此代码 current_user 的问题是 nil。如果我找到使用电子邮件的用户,那么如果用户对 google 和 facebook 使用相同的电子邮件,它就可以了。如果其中一个或多个与记录不同(用户使用表单注册),则创建新用户。我不要那个。我该如何克服这个问题?

【问题讨论】:

    标签: ruby-on-rails facebook authorization omniauth


    【解决方案1】:

    在我看来,从外部分析,您首先需要确定您的应用程序是什么帐户。

    1) 如果没有找到 demo2@gmail.com,您需要强制您的用户使用电子邮件和密码或 ominauth facebook (user_signed_in? == true) 登录并创建另一个功能/视图以附加omniauth 帐户(google ,混帐...)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-26
      • 2023-03-21
      • 2013-02-14
      • 1970-01-01
      • 2010-11-16
      相关资源
      最近更新 更多