У меня есть приложение 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