无需密码的身份验证设备

问题描述 投票:0回答:1
if params[:confirm_token] == "true"
      user = User.find_by(email: params[:email])
      binding.pry
      sign_in(user)
      # super
end

我需要在没有密码的情况下验证用户。

我尝试了 sign_in(user),但是当它呈现时显示 401 invalid credentials

尝试使用 sign_in 方法登录用户,但没有成功。

ruby-on-rails authentication devise password-less
1个回答
1
投票

您可以在设计中定义自定义策略。通过添加自定义策略设计 gem 将负责用户登录。

添加策略文件初始化文件夹

# config/initializers/confirm_token_strategy.rb
module Devise
  module Strategies
    class ConfirmToken < Base
      def valid?
        params[:confirm_token].present?
      end

      def authenticate!
        confirm_token_object = ConfirmTokenObject.find_by(token: params[:confirm_token])
        # token verification
        if confirm_token_object.blank?
          fail!("#{params[:confirm_token]} is not a valid code or expired!")
        else
          user = User.find_by(email: params[:email])
          success!(user)
        end
      end
    end
  end
end

将策略添加到监狱长

# config/initializers/devise.rb
config.warden do |manager|
  manager.strategies.add(:confirm_token, Devise::Strategies::ConfirmToken)
end

在监狱长认证中使用策略

# users_controller.rb
def verify_confirm_token
  self.resource = warden.authenticate!(:confirm_token)
  sign_in_and_redirect resource and return if resource
end
© www.soinside.com 2019 - 2024. All rights reserved.