繁体   English   中英

使用 JWT 进行 NodeJS 用户身份验证

[英]NodeJS user authentication with JWT

我刚开始使用带有反应前端的 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 查询已正确执行,但在“结果”的回调中,我得到了奇怪的对象。 我想我应该从数据库表中获取一些相应数据的数组,并在我的控制台日志中获取 [object object]。 我不确定这实际上意味着什么,我也确信这是一个阻止程序,因为我无法在我的 userController 中使用此对象检索密码。 任何帮助将不胜感激。 谢谢!

问题

  • compareSync返回一个布尔值,其中true表示正确的密码。 您正在使用if(!result) ,这是相反的。
  • 确保您的{}else上是正确的
  • 您正在记录undefined result.password ,因为result是您的 compareSync 返回值。 你的意思是记录results.password 避免将resultresults用于两种不同的事情,因为这样很容易犯这些错误。 bcryptResultresultObj这样的东西可能会更好。
  • 当您使用console.log() ,将数据作为第二个参数传递或创建第二个日志,因为连接对象始终显示[object Object]

更新的片段

  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', results.password)
    return res.json({
      success: 0,
      error: 'Invalid email or password'
    });
  }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM