Bcrypt больше не хеширует и не солит пароли - PullRequest
0 голосов
/ 18 февраля 2019

В предыдущей версии моего текущего приложения у меня есть работающее бэкэнд-приложение с bcrypt, которое солит и хэширует мои пароли.В этой версии я сейчас работаю над копией 1 на 1 с теми же маршрутами и контроллерами.Все отлично работает, данные из почтового запроса хорошо сохранены, но без хешированного пароля.Пустой пароль теперь отображается.

Я работаю в Windows 10, 64-битная, обе версии в моих версиях bcrypt 3.0.4 локально установлены.Я работаю с mongoDB и mongoose.

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

Кто-нибудь знает, что изменилось?

Вот код:

//relevant parts of app.js
const express = require('express');
const path = require('path');
//const favicon = require('serve-favicon');
const logger = require('morgan');
const cookieParser = require('cookie-parser');
const bodyParser = require('body-parser');
const helmet = require('helmet');
const cors = require('cors');

// connection to mongoose 
require('./app_api/models/db');

//route to routes
const users = require('./app_api/routes/users');

//routes (post request)
router
	.route('/user/signup')
	.post(AuthenticationControllerPolicy.signupPost, ctrlUsers.signupPost); 

//fragment of the post controller
const signupPost = function (req, res) {
	//Make sure this account already exists
	Base.
		findOne({
			userName: req.body.userName
		}, function (user, err) {
			//Make sure user doesn 't already exist
			if (err) {
				return res.status(400).send({ msg: 'The email address you have entered is already associated with another account.' });
			} else { //etc..


//Create and save the user
user = new Base({
password: req.body.password
});
user.save(function (err) {

// base model with hashing and salting code
const baseSchema = new mongoose.Schema({
	password: { type: String, required: true }
	}, options);

const Base = mongoose.model('Base', baseSchema);

// salting and hashing
						

// hashing and salting before saving
baseSchema.pre('save', function (next) {

	let base = this;
	// only hash the password if it has been modified (or is new)
	if (!base.isModified('password')) return next();

	//generate a salt
	bcrypt.genSalt(SALT_WORK_FACTOR, function (err, salt) {
	if (err) return next(err);

	// hash the password using our new salt
	bcrypt.hash(base.password, salt, function (err, hash) {
	if (err) return next(err);

	// override the cleartext password with the hashed one
	base.password = hash;
	next();
		});
	});
	});

1 Ответ

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

Попробуйте что-нибудь подобное.убедитесь, что const Base = mongoose.model ('Base', baseSchema); находится в конце кода, так как он отвечает за создание модели, и так как вы объявили ее сверху до pre hook не будет создан и пароль не будет хеширован.

    // On Save Hook, encrypt password
    // Before saving a model, run this function
    baseSchema.pre('save', function (next) {
      //get access to the user model
      const base= this;

      // generate a salt then run callback
      bcrypt.genSalt(SALT_WORK_FACTOR, function (err, salt) {
        if (err) { return next(err); }

        // hash (encrypt) our password using the sale
        bcrypt.hash(base.password, salt, null, function (err, hash) {
          if (err) { return next(err); }

          //overwrite plain text password with encrypted password
          base.password = hash;
          next();
        });
      });
    });

const Base = mongoose.model('Base', baseSchema);
...