Facebook& Google Omniauth&使用身份验证的Rails应用程序

时间:2016-08-16 19:00:09

标签: ruby-on-rails facebook authorization omniauth

我想让我的用户通过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&amp;谷歌登录。

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,在谷歌上有一个demo2@gmail.com。如何理解这些电子邮件是同一个人?

  2. 当我使用表单注册时,我会给我的facebook发送电子邮件demo1@gmail.com,然后我想将facebook和google连接到此用户。

  3. current_user操作中此代码fbcreate的问题是nil。如果我发现用户有电子邮件,如果用户为谷歌和Facebook使用相同的电子邮件,它就可以了。如果它们中的一个或多个与记录(用户使用表单注册)不同,则创建新用户。我不要那个。我怎样才能克服这个问题?

1 个答案:

答案 0 :(得分:0)

在我看来,从外部分析您首先需要确定您的申请帐户。

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