Node.js 当程序中直接提供机密时,jsonwebtoken验证失败

Node.js 当程序中直接提供机密时,jsonwebtoken验证失败,node.js,jwt,json-web-token,Node.js,Jwt,Json Web Token,我正在尝试使用jsonwebtoken npm验证和解码json web令牌,使用以下代码段: var jwt = require('jsonwebtoken'); var fs = require('fs'); var encoded = 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI6IjEiLCJsb2dpbklkIjoicm9vdCIsInVzZXJOYW1lIjoicm9vdCIsInJvbGUiOiIwIiwic3RhdHVzIjoiMS

我正在尝试使用jsonwebtoken npm验证和解码json web令牌,使用以下代码段:

var jwt = require('jsonwebtoken');
var fs = require('fs');

var encoded = 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI6IjEiLCJsb2dpbklkIjoicm9vdCIsInVzZXJOYW1lIjoicm9vdCIsInJvbGUiOiIwIiwic3RhdHVzIjoiMSIsInBhc3N3b3JkIjoiYWNiM2UxNDFkODgzMTA2ZGUyZjMwZDQ2ZTc2YzA5Y2YiLCJuYW1hayI6InJvb3QiLCJsYXN0TG9naW5UaW1lIjoibnVsbCIsImVtYWlsIjoicm9vdEBlY3AuY29tdml2YS5jb20iLCJjb250YWN0Tm8iOiIwMTIzNDU2Nzg5IiwiYXV0aFR5cGUiOiJudWxsIiwicGFyZW50SWQiOiJudWxsIiwibGFuZ3VhZ2UiOiJudWxsIiwiY3VycmVuY3kiOiJudWxsIiwiYWN0aXZhdGlvbkR0IjoibnVsbCIsImV4cGlyeUR0IjoibnVsbCIsImRlbGV0ZWRBdCI6Im51bGwiLCJwZXJtcyI6IntcIiVcIjo3fSIsImJhbGFuY2UiOiIxMjk5IiwiY2FjaGVkIjp0cnVlLCJpYXQiOjE0NTcxMDA5MjZ9.yn2Vb3hE7BKrXntCa-pTVAS7MwsaHD1csPZMiibOhwk';

fs.readFile('/etc/jwt/shared.key', function(err, result){
  if (err) {
    console.error("error:", err);
    return;
  }
  var verified = jwt.verify(encoded, 'ssshhhh');
  //var verified = jwt.verify(encoded, result);
  console.log("verified:", verified);
});
当我尝试使用硬编码值jwt.verify()时,程序失败

     if (err) throw err;
                     ^
JsonWebTokenError: invalid signature
    at Object.JWT.verify (/home/rvnath/projects/comviva/mbs/ecp7/dev/authserver/node_modules/jsonwebtoken/index.js:219:17)
    at /home/rvnath/projects/comviva/mbs/ecp7/dev/authserver/testverify.js:11:22
    at fs.js:334:14
    at FSReqWrap.oncomplete (fs.js:95:15)
但是,如果我读取密钥文件(而不是硬编码)并将其提供给verify函数,它将正常工作。以下是本例中程序的输出:

rvnath@rv ~/projects/comviva/mbs/ecp7/dev/authserver $ node testverify.js 
verified: { id: '1',
  loginId: 'root',
  userName: 'root',
  role: '0',
  status: '1',
  password: 'acb3e141d883106de2f30d46e76c09cf',
  namak: 'root',
  lastLoginTime: 'null',
  email: 'root@ecp.ecp.com',
  contactNo: '0123456789',
  authType: 'null',
  parentId: 'null',
  language: 'null',
  currency: 'null',
  activationDt: 'null',
  expiryDt: 'null',
  deletedAt: 'null',
  perms: '{"%":7}',
  balance: '1299',
  cached: true,
  iat: 1457100926 }
我的秘密文件是一个简单的文本文件,如下所示:

rvnath@rv ~ $ cat /etc/jwt/shared.key 
ssshhhh
rvnath@rv ~ $ 
总之,我尝试使用与/etc/jwt/shared.key文件中存储的密钥相同的密钥进行解码,但在程序中硬编码密钥值时,解码失败。我做错了什么

编辑 jwt由我的服务器应用程序通过读取同一文件中的机密生成:

/** Creates a signed JSON WEB TOKEN **/
function createJWT(user) {
  return fs.readFileAsync('/etc/jwt/shared.key').then(function(cert){
    var secret = cert.toString();
    console.log("shared secret:", secret);
    var token = jwt.sign(user, secret);
    //console.log("token verification:",jwt.verify(token, cert));
    return token;
  });
}

这是一个愚蠢的琐碎问题,但花了很多时间才弄清楚。当从文件中读取机密时,它会在字符串中附加一个LF(linefeed)字符。所以,当同一个秘密被硬编码时,它没有LF。这就是区别的原因