Должен ли я добавить столбец password_digest в таблицу учеников, чтобы запускать student.authenticate (пароль)? Даже если я использую Devise? - PullRequest
0 голосов
/ 08 ноября 2019

Я внедряю API аутентификации на основе токенов в своем коде, следуя шагам по ссылке ниже:

https://www.pluralsight.com/guides/token-based-authentication-with-ruby-on-rails-5-api

authentication_controller.rb is:

class AuthenticationController < ApplicationController
 skip_before_action :authenticate_request
 skip_before_action :verify_authenticity_token

 def authenticate
  binding.pry
   command = AuthenticateStudent.call(params[:corporative_email], params[:password])

   if command.success?
     render json: { auth_token: command.result }
   else
     render json: { error: command.errors }, status: :unauthorized
   end
 end
end

authenticate_student.rb - это:

class AuthenticateStudent
  prepend SimpleCommand

  def initialize(corporative_email, password)
    binding.pry
    @corporative_email = corporative_email
    @password = password
  end

  def call
    binding.pry
    JsonWebToken.encode(student_id: student.id) if student
  end

  private

  attr_accessor :corporative_email, :password

  def student
    binding.pry
    student = Student.find_by_corporative_email(corporative_email)
    return student if student && student.authenticate(password)

    errors.add :student_authentication, 'invalid credentials'
    nil
  end
end

Все идет хорошо до последней попытки, когда код прерывается на student.authenticate(password) и сервер возвращает «ArgumentError (неправильное количество аргументов (задано 0, ожидается 1)):». На консоли «пароль» возвращает «123456», как и ожидалось, что означает для меня, что данный номер аргумента не должен равняться нулю.

Кто-нибудь знает, что здесь происходит?

1 Ответ

0 голосов
/ 12 ноября 2019

Я нашел ответ. Если вы используете devise и хотите следовать приведенному ниже руководству, забудьте о части "gem 'bcrypt'" и обо всем, что с ней связано (включая метод has_secure_password).

https://www.pluralsight.com/guides/token-based-authentication-with-ruby-on-rails-5-api

Наконец, вcommand / authenticate_student.rb (в моем случае я изменил пользователя на студента) заменил строку:

return student if student && student.authenticate(password)

на:

return student if student && student.valid_password?(password)

valid_password? это метод разработки и будет выполнять ту же работу, что и аутентификация.

Вот и все!

...