У меня есть приложение Rails, которое использует Devise и Omniauth для обработки аутентификаций.Как предписано, я получаю обратные вызовы от провайдеров в моем omniauth_callbacks_controller, где я проверяю, существует ли аутентификация, и существует ли уже пользователь с электронной почтой, предоставленной провайдером, создавая нового пользователя при необходимости.
Мне нужен действующий адрес электронной почты для каждого пользователя.Моя проблема связана с обратными вызовами из Twitter.Твиттер не предоставляет электронную почту для своих пользователей, поэтому я не могу создать действительного пользователя.Чтобы решить эту проблему, я сохраняю данные провайдера в сеансе и отправляю пользователю новую страницу регистрации, прося его предоставить свой адрес электронной почты, чтобы я мог создать действительного пользователя.Когда эта форма отправлена, я столкнулся с проблемой.Форма создала нового пользователя, но вполне возможно, что пользователь с таким адресом электронной почты уже существует (в этом случае мне необходимо добавить аутентификацию для этого пользователя).
В данный момент я проверяюпосмотреть, существует ли уже пользователь с таким же адресом электронной почты, что и новыйЕсли это так, я игнорирую нового пользователя и применяю аутентификацию к пользователю, который уже существует.Тем не менее, это кажется действительно хакерским.
Как мне это сделать?
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