无法在devise-auth-token中禁用电子邮件验证

时间:2018-03-29 15:24:19

标签: ruby-on-rails devise

我正在使用devise-auth-token,并希望使用除电子邮件之外的字段登录。 所以我使用phone_number代替,一切正常,但我无法删除电子邮件验证,这是我的代码

user.rb

 class User < ActiveRecord::Base
  include DeviseTokenAuth::Concerns::User
  devise :database_authenticatable, :confirmable, authentication_keys: [:phone_number]

  mount_uploader :avatar, AvatarUploader
  validates :first_name,  presence: true,format: {with: /[[:word:]]/}
  validates :last_name ,  presence: true,format: {with: /[[:word:]]/}
  validates :email     ,  format: { with: /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\z/i, on: :create }, uniqueness: true
  validates :phone_number, presence: true, uniqueness: true
  validate  :birthdate_in_the_future_invalid
  validates :country_code, presence: true
  validates :birthdate, presence: true
  validates :gender, presence: true
  # validates :file, presence: true
  validates :phone_number, phone: { possible: true, types: [:mobile], country_specifier: -> phone { phone.country_code.try(:upcase) } }
  validate :e164_phone_number


  after_create :set_provider_uid

  def email_required?
    false
  end

  def email_changed?
    false
  end

  def password_required?
    super if confirmed?
  end

  def password_match(password, password_confirmation)
    self.errors[:password] << "can't be blank" if password.blank?
    self.errors[:password_confirmation] << "can't be blank" if password_confirmation.blank?
    self.errors[:password_confirmation] << "does not match password" if password != password_confirmation
    password == password_confirmation && !password.blank?
  end

  private
  def birthdate_in_the_future_invalid
    begin
      if Date.strptime(birthdate, '%d-%m-%Y') > Date.today
        errors.add(:birthdate, "in_the_future")
      end
    rescue
      errors.add(:birthdate, "invalid format")
    end
  end

  def e164_phone_number
    if phone_number[0] != '+'
      errors.add(:phone_number, "invalid format")
    end
  end

  def set_provider_uid
   self.update_column(:uid, phone_number)
   self.update_column(:provider, "phone_number")
  end


end

这是我的初始值设定项/ devise.rb

Devise.setup do |config|

  config.mailer_sender = 'aliabdelrahmanweka74@gmail.com'
  require 'devise/orm/active_record'
  config.authentication_keys = [:phone_number]
  config.case_insensitive_keys = [:phone_number]
  config.strip_whitespace_keys = [:phone_number]
  config.skip_session_storage = [:http_auth]
  config.stretches = Rails.env.test? ? 1 : 11
  config.reconfirmable = false
  config.expire_all_remember_me_on_sign_out = true
  config.password_length = 6..128
  config.email_regexp = /\A[^@\s]+@[^@\s]+\z/
  config.reset_password_within = 6.hours
  config.sign_out_via = :delete
end

我用了funciton email_required?并使其返回false但没有任何反应

我调用localhost:3000 / users,Method Post 参数:

{
    "user": {
        "first_name": "ali",
        "last_name": "weka",
        "gender": "male",
        "birthdate": "25-06-2016",
        "email": "",
        "phone_number": "+201118574649",
        "country_code": "EG",
        "uid": "+201118574649",
        "provider": "phone_number"
    }
}

这是响应

{"status":"error","data":{"id":null,"first_name":"ali","last_name":"ali","country_code":"EG","phone_number":"+201119574649","gender":"male","birthdate":"25-06-2016","created_at":null,"updated_at":null,"provider":"email","uid":"+201119574649","avatar":{"url":null},"email":""},"errors":{"email":["can't be blank","is invalid"],"full_messages":["Email can't be blank","Email is invalid"]}}

所以请帮忙吗?

1 个答案:

答案 0 :(得分:1)

我有同样的问题。我希望一些用户使用电子邮件,而有些用户则不需要。

解决方案

您首先应通过迁移从用户表中删除null:false限制。如果要删除默认的“”,请执行此操作。不要删除索引,因此它仍然可以验证电子邮件的唯一性(以防您有时仍使用电子邮件)。空值不会对唯一约束造成任何问题。

如果您使用的是可验证的设备,请在用户模型中添加此方法:

def email_required?
  false
end

完成上一部分之后,您应该执行以下操作之一:

选项1 : 深入研究devise_token_auth gem,至少在我看来,我意识到其中包含了this concern

默认情况下已包含它,除非您使用以下方式修改DeviseTokenAuth初始化程序

config.default_callbacks = false

但是也许你不想要那个。

选项2 : 如果您检查了我链接的关注点中的代码,则可以看到它可以验证电子邮件,以防万一 user provider 是'email'。

我的解决方法是将没有电子邮件的用户的 provider 字段更改为其他内容。 进行这两项更改后,您的电子邮件将不再有效。


对于某些有时需要电子邮件的人:

  • 当然可以Devise wiki says
  • 除其他字段外,还包括case_insensitive_keys,strip_whitespace_keys中的电子邮件

,您可以在User模型中使用以下方法:

def email_required?
  true unless phone_number?
end