使用JWT的NodeJS用户身份验证

时间:2020-02-28 14:39:08

标签: javascript mysql node.js reactjs express

我刚开始使用带有前端的nodejs。但是在验证用户身份时出现一些问题。我正在尝试使用特定的电子邮件和密码来获取用户。我的API如下: 我为任何api请求创建了三个文件控制器,服务和路由器文件。

//userServices.js
const db = require('./../../db-connection/connection')

userAuth: (params, callback) => {
    db.query(`SELECT * FROM Users WHERE email = ?`,[params.email],
      (error, result, fields) => {
        if(!error) {
          console.log('result = ' + result[0]);
          return callback(error, result[0])
        }
        else
          return callback(error)
      });
  }

这是我的userController js文件。

//userController.js
const {create, userindex, userAuth} = require('./UserServices');
const {genSaltSync, hashSync, compareSync} = require('bcrypt');
const {sign} = require('jsonwebtoken');

userLoginAuth: (req, res) => {
    const body = req.body;
    userAuth(body, (error, results) => {
      if (error)
        console.log(error);

      if (!results) {
        return res.json({
          success: 0,
          data: 'Invalid email or password'
        })
      }

      const result = compareSync(body.password, results.password);
      if(!result) {
        results.password = undefined;
        const jsontoken = sign({result: results}, 'choegyel123', {
          expiresIn: '1h'
        });
        return res.json({
          success: 1,
          message: 'Login successful',
          token: jsontoken
        })
      } else
        console.log('password' + result.password)
      return res.json({
        success: 0,
        error: 'Invalid email or password'
      });
    });
  }

但是问题出在userServices.js文件中。我的sql查询已正确执行,但在对“结果”的回调中,我得到了奇怪的对象。我想我应该从数据库表中获取一些相应数据的数组,并且在控制台日志中,我正在获取[对象对象]。我不确定这实际上意味着什么,而且我也都确定这是一个阻止程序,因为我无法在userController中使用该对象检索密码。任何帮助将不胜感激。谢谢!

1 个答案:

答案 0 :(得分:0)

问题

  • compareSync返回带有true的布尔值,指示正确的密码。您正在使用if(!result),相反。
  • 确保您的{}else上是正确的
  • 您正在记录result.password的{​​{1}},因为undefined是您的compareSync返回值。您打算登录result。避免将results.passwordresult用于两种不同的事物,因为这样很容易犯这些错误。像resultsbcryptResult之类的东西可能会更好。
  • resultObj时,将数据作为第二个参数传递或记录第二个日志,因为连接对象始终显示console.log()

更新的代码段

[object Object]