【发布时间】:2012-03-11 01:05:43
【问题描述】:
我有一个使用 Devise 和 Omniauth 来处理身份验证的 Rails 应用程序。按照规定,我在我的 omniauth_callbacks_controller 中接收来自提供商的回调,在那里我检查身份验证是否已经存在,以及是否已经存在具有提供商提供的电子邮件的用户,如有必要,请创建一个新用户。
我需要为每个用户提供一个有效的电子邮件。我的问题来自 Twitter 的回调。 Twitter 不为其用户提供电子邮件,因此我无法创建有效用户。为了解决这个问题,我将提供商的数据存储在一个会话中,然后我向用户发送新的注册页面,要求他们提交他们的电子邮件地址,以便我可以创建一个有效的用户。提交此表单时,我遇到了问题。该表单创建了一个新用户,但很可能已经存在具有该电子邮件的用户(在这种情况下,我需要为该用户添加身份验证)。
目前我正在检查是否已经存在与新用户具有相同电子邮件的用户。如果是这样,我将忽略新用户并将身份验证应用于已存在的用户。然而,这感觉真的很hacky。
我该怎么做?
class Users::RegistrationsController < Devise::RegistrationsController
def build_resource(*args)
super
if session[:omniauth]
#If a user with this email already exists then use them instead
existing_user = User.find_by_email(@user.email)
if(existing_user)
existing_user.email = @user.email
@user = existing_user
end
#If there is a session available, we know it contains data for adding an authentication
@user.apply_omniauth_data_as_authentication(session[:omniauth])
#Ensure validations are passed on to next page
@user.valid?
end
end
【问题讨论】:
-
您解决了这个问题吗?我也有同样的问题。
-
@Finnnn 刚刚在答案中发布了我的 Omniauth 回调控制器。
标签: ruby-on-rails ruby-on-rails-3 twitter devise omniauth