【问题标题】:NodeJS user authentication with JWT使用 JWT 进行 NodeJS 用户身份验证
【发布时间】:2020-02-28 14:39:08
【问题描述】:

我刚开始使用带有 react 前端的 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 中使用这个对象检索密码。任何帮助将不胜感激。谢谢!

【问题讨论】:

  • 不要连接日志消息,而是给出单独的对象。 “console.log('password', result.password)”。逗号而不是加号。这并不能解决您的主要问题,但会告诉您 result.password 实际上是什么
  • 当您执行console.log(JSON.stringify(result[0])); 时会得到什么?
  • @c_froehlich:上面写着“密码”未定义
  • 然后查看结果:console.log(result)

标签: javascript mysql node.js reactjs express


【解决方案1】:

问题

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

更新的 sn-p

  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'
    });
  }

【讨论】:

    猜你喜欢
    • 2019-08-18
    • 1970-01-01
    • 2016-04-07
    • 2020-01-03
    • 2023-03-27
    • 2021-05-29
    • 2017-07-30
    • 2018-06-30
    • 2018-08-03
    相关资源
    最近更新 更多