パスワードなしでワーデン/デバイスでユーザーを認証するにはどうすればよいですか?

概要

私のアプリでは、ログイン時にユーザーは電子メールのみを入力し、パスワードは必要ありません。device/warden を使用して認証したいと考えています。

class Users::SessionsController < Devise::SessionsController
  include ExpireExistingToken

  def new
    super
  end

  def create
    self.resource = warden.authenticate!(auth_options)
    set_flash_message!(:notice, :signed_in)
    sign_in(resource_name, resource)
    yield resource if block_given?
    resource.update(language: Constant::SUPPORTED_LANGUAGES.key(params['locale'])) if params['locale'].present?
    resource.send_otp(force_expire: true) if resource.email_verified?
    respond_with resource, location: after_sign_in_path_for(resource)
    flash.delete(:notice)
  end

  def destroy
    session.delete(:is_otp_verified)
    super
  end
end
# frozen_string_literal: true

# Responsible for token expiration
module ExpireExistingToken
  extend ActiveSupport::Concern

  included do
    before_action :remove_existing_token, only: :new
  end

  protected

  def remove_existing_token
    uuid = session[:uuid]
    usr = User.find_by(uuid: uuid) if uuid
    return unless usr
    usr.send(:clear_reset_password_token)
    usr.save
    session.delete(:uuid)
  end
end

valid_password をオーバーライドしようとしました?ユーザーモデルで実行しましたが、うまくいきませんでした。これについて私を助けてください。

解決策

Devise のパスワード必須検証メソッドをオーバーライドして、保存時に false を返すことができます。特定のリソースまたは機能に対してのみ無効にしたい場合は、保存中にフォームから仮想属性を送信する必要があります。

class User < ActiveRecord::Base
  attr_accessor :skip_validation  

  protected

  def password_required?
    return false if skip_validation
    super
  end
end