Разрешить нескольким пользователям использовать один и тот же адрес электронной почты с помощью Devise Token Auth

Я хочу разрешить создание нескольких пользователей с одним и тем же адресом электронной почты с помощью devise-token-auth .

Вместо того, чтобы выдавать эту ошибку.

@details={:email=>[{:error=>:taken, :value=>"[email protected]"}]}>

Я ожидал, что удаление devise :validatable из user.rb сработает, но этого не произошло.

user.rb

class User < ActiveRecord::Base
  extend Devise::Models
  include DeviseTokenAuth::Concerns::User
  
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable
end

Я нашел этот похожий вопрос SO много лет назад, но предложения не сработали.

Мне интересно, является ли это конкретно проблемой авторизации токена разработки, а не разработкой.

Кто-нибудь решил это раньше?


person tim_xyz    schedule 20.08.2020    source источник


Ответы (1)


До сих пор я мог найти только хакерский способ добиться этого и хотел поделиться.

Учитывая, что не существует простого способа сделать это.

Мне пришлось установить метод provider с DeviseTokenAuth::Concerns::ResourceFinder на nil. По умолчанию жестко задано "email".

    def provider
      nil
    end

Поэтому, когда build_resource вызывается в registrations_controller.rb, он не будет автоматически устанавливать provider="email".

Без provider="email" ошибка "Электронная почта уже принята" больше не выдается.

    def build_resource
      @resource            = resource_class.new(sign_up_params)
      @resource.provider   = provider

      # honor devise configuration for case_insensitive_keys
      if resource_class.case_insensitive_keys.include?(:email)
        @resource.email = sign_up_params[:email].try(:downcase)
      else
        @resource.email = sign_up_params[:email]
      end
    end

Но, изменив приведенную выше логику, uid больше не обновляется значением электронной почты пользователя. Поэтому я добавил обратный вызов на User.rb, чтобы компенсировать это.

  after_initialize do
    self.uid = self.email
  end

Это работает, но я бы хотел более простой способ добиться этого.

person tim_xyz    schedule 21.08.2020