Данные и соленые аргументы требуют ошибки (авторизация) - PullRequest
2 голосов
/ 09 января 2020

Я новичок в NodeJS, и я попытался создать форму аутентификации, используя NodeJS + express. Я хочу сделать проверку для моего пароля (когда «Подтверждение пароля» отличается от «пароля», оно не должно возвращать ничего. К сожалению, я продолжаю получать «данные и аргументы соли требуются». Я пытался по-разному поставить некоторые условия, но Я продолжаю получать эту ошибку. Любые идеи, как я должен заставить ее работать? Вот файл user. js:

const pool = require('./pool');
const bcrypt = require('bcrypt');


function User() {};

User.prototype = {

find : function(user = null, callback)
{
    if(user) {     
        var field = Number.isInteger(user) ? 'id' : 'username';
    }
    let sql = `SELECT * FROM users WHERE ${field} = ?`;

    pool.query(sql, user, function(err, result) {
        if(err) 
            throw err
        if(result.length) {
            callback(result[0]);
        }else {
            callback(null);
        }
    });
},

create : function(body, callback) 
{
    var pwd = body.password;
    var cpwd = body.confirmpassword;

    // here i hash the pass
    body.password = bcrypt.hashSync(pwd,10);
    body.confirmpassword = bcrypt.hashSync(cpwd, 10);

    if (body.password != body.confirmpassword){
        callback(null);
    }
    else {

    var bind = [];

    for(prop in body){
        bind.push(body[prop]);
    }

    let sql = `INSERT INTO users(username, fullname, password) VALUES (?, ?, ?)`;

    pool.query(sql, bind, function(err, result) {
        if(err) throw err;     
        callback(result.insertId);
    });
    }
},

login : function(username, password, callback)
{
    this.find(username, function(user) {
        if(user) {
            if(bcrypt.compareSync(password, user.password)) {       
                callback(user);
                return;
            }  
        }
        callback(null);
    });    
}

}
module.exports = User;

И файл страниц. js:

const express = require('express');
const User = require('../core/user');
const router = express.Router();

const user = new User();

router.get('/', (req, res, next) => {
    let user = req.session.user;
    if(user) {
        res.redirect('/home');
        return;
    }
    res.render('index', {title:"My application"});
})

router.get('/home', (req, res, next) => {
    let user = req.session.user;
    if(user) {
        res.render('home', {opp:req.session.opp, name:user.fullname});
        return;
    }
    res.redirect('/');
});


router.post('/login', (req, res, next) => {
    user.login(req.body.username, req.body.password, function(result) {
        if(result) {           
            req.session.user = result;
            req.session.opp = 1;          
            res.redirect('/home');
        }else {        
            res.send('Username/Password incorrect!');
        }
    })

});

router.post('/register', (req, res, next) => {
    let userInput = {
        username: req.body.username,
        fullname: req.body.fullname,
        password: req.body.password
    };

    user.create(userInput, function(lastId) {
        if(lastId) {
            user.find(lastId, function(result) {
                req.session.user = result;
                req.session.opp = 1;
                res.redirect('/home');
            });
        }else {
            console.log('Error creating a new user ...');
        }
    });
});

router.get('/logout', (req, res, next) => {
    if(req.session.user) {
        req.session.destroy(function() {
            res.redirect('/');
        });
    }
});
module.exports = router;

1 Ответ

0 голосов
/ 09 января 2020

В userInput вы не передаете свойство confirmpassword.

let userInput = {
    username: req.body.username,
    fullname: req.body.fullname,
    password: req.body.password
};

В методе создания вы получаете к нему доступ. var cpwd = body.confirmpassword;

cpwd имеет значение null, и это является причиной ошибки.

   body.confirmpassword = bcrypt.hashSync(cpwd, 10);//**cpwd is null**

Согласно документам, аргумент data является обязательным, и он не может быть нулевым.

hashSyn c (данные, соль)

данные - [ТРЕБУЕТСЯ] - данные, которые должны быть зашифрованы.

соль - [ТРЕБУЕТСЯ] - соль, которая будет использоваться для га sh пароль.

...