我想让我的用户通过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 )
确定。所以我的问题是;
我在Facebook上有一个电子邮件地址demo1@gmail.com,在谷歌上有一个demo2@gmail.com。如何理解这些电子邮件是同一个人?
当我使用表单注册时,我会给我的facebook发送电子邮件demo1@gmail.com,然后我想将facebook和google连接到此用户。
current_user
操作中此代码fbcreate
的问题是nil。如果我发现用户有电子邮件,如果用户为谷歌和Facebook使用相同的电子邮件,它就可以了。如果它们中的一个或多个与记录(用户使用表单注册)不同,则创建新用户。我不要那个。我怎样才能克服这个问题?