【发布时间】: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 )
好的。所以我的问题是;
我在 facebook 上有一个电子邮件地址 demo1@gmail.com,在 google 上有一个 demo2@gmail.com。怎么能理解这些邮件是同一个人呢?
当我使用表单注册时,我给我的 facebook 电子邮件 demo1@gmail.com 然后我想将 facebook 和 google 附加到这个用户。
fbcreate 操作中的此代码 current_user 的问题是 nil。如果我找到使用电子邮件的用户,那么如果用户对 google 和 facebook 使用相同的电子邮件,它就可以了。如果其中一个或多个与记录不同(用户使用表单注册),则创建新用户。我不要那个。我该如何克服这个问题?
【问题讨论】:
标签: ruby-on-rails facebook authorization omniauth