@E-em

Почему пароли не совпадают?

Всем привет!
Есть такая простая модель юзера
import mongoose, { Schema } from 'mongoose';
import bcrypt from 'bcrypt-as-promised';

const userSchema = new Schema({
    login: {
        type: String,
        required: true,
        unique: true,
        index: true
    },
    password: String
});

userSchema.pre('save', async function(next) {
    if (!this.isModified('password')) return next();

    const salt = await bcrypt.genSalt(10);
    this.password = await bcrypt.hash(this.password, salt);

    next();
});

userSchema.methods.checkPassword = password => {
    return bcrypt.compare(password, this.password);
};

const User = mongoose.model('User', userSchema);

export default User;

и контроллер
import models from '../models/main';

export const signUp = async (request, response, next) => {
    const credentials = request.body;
    let user;

    try {
        user = await models.User.create(credentials);
    } catch(error) {
        return next({
            status: 400,
            message: error.message
        });
    }

    response.json(user);
};

export const signIn = async (request, response, next) => {
    const { login, password } = request.body;

    const user = await models.User.findOne({ login });

    if (user) {
        try {
            (await models.User.checkPassword(password));
        } catch(error) {
            return next({
                status: 400,
                message: 'Wrong password'
            });
        }
    } else {
        return next({
            status: 400,
            message: 'User not found'
        });
    }

    request.session.userId = user._id;
    response.json(user);
};

регистраци работает нормально, пароль хеширует, но при пост запросе уже на signin происходит другой компот, юзера находит, но пароль не совпадает, мне отдает wrong password, не пойму в чём проблема, может быть он сравнивает хеш пароль?
  • Вопрос задан
  • 1126 просмотров
Решения вопроса 1
@timokins
Ошибка в этой строке:
(await models.User.checkPassword(password));
нужно не абстрактно к модели обращаться, а через полученный ранее экземпляр:
const user = await models.User.findOne({ login });
т.е.
(user.checkPassword(password));
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы