【问题标题】:token is not created in nodejs令牌未在 nodejs 中创建
【发布时间】:2016-08-30 23:41:42
【问题描述】:

我有一个从 mysql 数据库中选择用户名并将结果返回到 post 请求的函数,如下所示:

function userAuthentication(user){
var deferred = Q.defer();
pool.getConnection(function(err, connection) {
    if (err) {
        var dbError = new Error('No db connection');
        console.log(dbError);
    }
    else {
        var selectUserName = 'SELECT * FROM User WHERE username= '+connection.escape(user)+' ';

        connection.query(selectUserName, function(error, rows){
            if(error){
                console.log(error);
                deferred.reject(error);
            }
            else if(rows.length === 0){
                var countError = new Error('No User Found');
                console.log ("Database.js -> "+ countError);
                deferred.reject(countError);
            }else{
                deferred.resolve(rows);
            }
        });
    }
    connection.release();
});
return deferred.promise;

}

函数userAuthentication从rout.post请求中调用

router.post('/checkAuthentication', function(request, response) {

    database.userAuthentication(request.body.username).then(function(data) {
        if(data[0].RowDataPacket!=0){
            if(bcrypt.compareSync(request.body.password,data[0].password)){
                var token = jwt.sign({
                   username: data[0].username,
                }, superSecret,{
                    expiresInMinutes: 1440
                });

                console.log(token);
                // return the information including token as JSON
                response.json({
                    success: true,
                    message: 'Token Created',
                    token: token
                }); 
            }
            else{
                response.json({ success: false, message: 'Authentication failed. Wrong Password.' });
            }
        }else{
            response.json({ success: false, message: 'Authentication failed. User not found.' });
        }       
    });
});

当我检查输入的用户名和密码是否与 mysqlDb 中的匹配时,我正在尝试创建一个令牌,但不幸的是没有创建令牌; console.log(token) 行没有将任何结果打印到控制台中。我缺少的部分是什么???感谢你们的帮助。

【问题讨论】:

  • 您说“console.log(token) 行没有将任何结果打印到控制台”:taht 到底是什么意思?甚至没有执行 console.log 语句吗?如果是,它是否打印一个空字符串,null,undefined...?
  • @MarcoS u 对,我将 var 令牌视为变量。如果创建了令牌,如何在控制台中检查?因为即使是下一行,response.json 也没有获取??
  • console.log(token) 语句甚至没有执行吗?如果是,它究竟打印了什么?
  • 控制台没有输出任何东西
  • 所以不执行。您应该尝试调试代码流,然后...例如在调用jwt.sign()之前添加一个console.log('calling jwt.sign()')语句,等等...

标签: node.js authentication token


【解决方案1】:

您使用的是哪个jwt 节点模块?
我想它不是node-jsonwebtoken,因为它不支持expiresInMinutes,而只支持expiresInMinutes...

但是,您应该将 jwt.sign() 调用包含在 try/catch 块中,以捕获它引发的任何错误...:

try {
  var token = jwt.sign(
    {
      username: data[0].username,
    },
    superSecret,
    {
      expiresIn: 1440 * 60,
    }
  );
} catch(err) {
  console.error('error signing json web token:', err);
}

【讨论】:

  • var jwt = require('jsonwebtoken') 这个,jsonwebtoken
  • 查看我的更新答案:尝试使用 try/catch 块,并使用 expiresIn 而不是 expiresInMinutes...
  • 实际上,我在您的控制器中没有看到任何superSecret 定义... :-(
  • 只是一个转储问题:$ 1440 * 60 它会在 24 小时内到期吗?
  • 是的,我只是将 1440 分钟转换为秒...您也可以使用“1 天”等,因为 expiresInrauchg/ms.js 格式(请参阅 github.com/rauchg/ms.js)。 ..
猜你喜欢
  • 1970-01-01
  • 2021-11-14
  • 2013-04-12
  • 2019-07-20
  • 1970-01-01
  • 1970-01-01
  • 2023-01-21
  • 2023-01-04
  • 2018-06-14
相关资源
最近更新 更多