Bcrypt говорит, что data и hash должны быть строкой, передавая, как мне кажется, строки - PullRequest
0 голосов
/ 30 октября 2018

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

Я храню данные в MariaDB, номер карты и пин-код являются некоторыми из этих данных. Номер карты зашифрован с использованием Bcrypt

Но при попытке аутентификации я получаю сообщение об ошибке

[0] (node:9282) UnhandledPromiseRejectionWarning: Error: data and hash must be strings

Я console.logging данные, переданные, чтобы увидеть, если они существуют, они хорошо отображаются в консоли. Я также пытался использовать JSON.stringify для данных, полученных из внешнего интерфейса.

код в моем файле аутентификатора

const express = require('express');
const router = express.Router();
const connection = require('../models/loginrouters');
const bcrypt = require('bcrypt');

router.post('/', function(req, res) {
  console.log('Starting authentification proccess');
  const CardNumber = req.body.cardnumber;
  const pin = JSON.stringify(req.body.pin);
  connection.query(
    'SELECT PIN, CardNumber FROM userCards WHERE CardNumber = ?',
    [CardNumber],
    function(error, results, fields) {
      if (error) {
        console.log('error ocurred', error);
        res.send({
          code: 400,
          failed: 'error ocurred'
        });
      } else {
        console.log('The result is: ', results);
        console.log('handling pin', pin);
        if (results.length > 0) {
          console.log('results over 0 is true');
          console.log('pin result from query is: ', results[0].PIN);
          console.log('pin result from form is: ', pin);
          if (bcrypt.compare(pin, 15) == results[0].PIN) {
            res.send({
              code: 200,
              success: 'login sucessfull'
            });
          } else {
            console.log('something went wrong/email and password does not match');
            res.send({
              code: 204,
              success: 'Email and password does not match'
            });
          }
        } else {
          console.log('result lenght is 0');
          res.send({
            code: 204,
            success: 'Email does not exits'
          });
        }
      }
    }
  );
});

module.exports = router;

Я также пытался жестко закодировать данные (pin и results [0] .PIN), но получаю ту же ошибку, полный консольный вывод ошибки можно найти здесь

Есть идеи, где ошибка? Я был бы рад выложить больше кода, если это поможет

1 Ответ

0 голосов
/ 31 октября 2018

Мне удалось решить эту проблему, не совсем уверенный как, но я переписал код и попытался как можно точнее следовать документации bcrypt, вот рабочий код.

router.post('/', function(req, result) {
  console.log('Starting authentification proccess');
  const CardNumber = req.body.cardnumber;
  const pin = req.body.pin;
  connection.query(
    'SELECT PIN, CardNumber FROM userCards WHERE CardNumber = ?',
    [CardNumber],
    function(error, results, fields) {
      if (error) {
        console.log('error ocurred', error);
        res.send({
          code: 400,
          failed: 'error ocurred'
        });
      } else {
        console.log('The result is: ', results);
        console.log('handling pin', pin);
        if (results.length > 0) {
          console.log('results over 0 is true');
          console.log('pin result from query is: ', results[0].PIN);
          console.log('pin result from form is: ', pin);

          bcrypt.compare(pin, results[0].PIN, function(err, res) {
            if (res) {
              console.log('login succefull');
              result.send({
                code: 200,
                success: 'login sucessfull'
              });
            } else if (err) {
              console.log('something went wrong/email and password does not match');
              console.log(err);
              result.send({
                code: 204,
                success: err
              });
            } else {
              console.log('result lenght is 0');
              result.send({
                code: 204,
                success: 'Email does not exits'
              });
            }
          });
        }
      }
    }
  );
});
...