Как аутентифицировать password_digest, созданный в Rails для Mon go DB? - PullRequest
0 голосов
/ 18 февраля 2020

HI! Я успешно создал способ генерации пароля с использованием безопасного пароля с помощью has_secure_password. Я смог сгенерировать password_digest:

//this is the data in my mongo db

/* 1 */
{
    "_id" : ObjectId("5e4b43d55c260c07b48cbf38"),
    "username" : "admin",
    "password_digest" : "$2a$12$93GElGpXK2AcfRvhNsH23O2mPlTiV.sHLrtuesFO5HSllxDqEE796"
}

/* 2 */
{
    "_id" : ObjectId("5e4b46c95c260c07b48cbf3c"),
    "username" : "jenuel",
    "password_digest" : "$2a$12$6LPYNpAzCAT/k8HHFVJT7..E0GO2iuBJolY0TPHbklz0J58/OLkRm"
}

это моя модель в рельсах

class User
  include Mongoid::Document
  include ActiveModel::SecurePassword
  include ActiveModel::Validations

  field :username, type: String
  field :password_digest, type: String
  has_secure_password
  validates_confirmation_of :password
end

Я смог создать это пользователи выше, использующие эту функцию внутри моего контроллера:

def create
    if check_username(params[:username]) == false
      @user = User.new(user_params)

      if @user.save
        render json: @user, status: :created, location: @user
      else
        render json: @user.errors, status: :unprocessable_entity
      end
    else
      render json: { error: "Username Already Exist" }, status: :unprocessable_entity
    end
  end

И это моя функция входа в систему:

 def login
    user = User.where(username: params[:username])
    if user.exists? && user.authenticate(params[:password])
        render json: { message: "Logged In!" }, status: :ok
    else
      render json: { error: "unauthorized" }, status: :unauthorized
    end
  end

Теперь проблема в функции входа в систему, когда я использую аутентификацию их ошибка: enter image description here

Пожалуйста, помогите. Другой способ сделать это - аутентифицировать пароль с помощью Rails для MongoDB / mongoloid. Большое вам спасибо:)

Ответы [ 2 ]

1 голос
/ 18 февраля 2020

В соответствии с общим фрагментом поста, похоже, что в результате вы получаете ActiveRecord :: Relation вместо объекта активной записи. См. Строку ниже

user = User.where(username: params[:username])

измените это значение на

user = User.where(username: params[:username]).last

Также теперь при переходе на вышеуказанный код следующее не будет работать

user.exists?

Также измените выше одного к указанному ниже

user.present?

Теперь вы должны иметь возможность заставить его работать.

0 голосов
/ 18 февраля 2020

Я смог найти ответ на свой вопрос. Для тех, кто имеет дело с такой проблемой, вы можете просто изменить эту строку кода.

user = User.where(username: params[:username])

на

user = User.find_by(username: params[:username])

Я понимаю, find_by - это способ получить одиночный запись, а where используйте, если вы что-то фильтруете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...