Node.js - Express.js JWT 总是在浏览器响应中返回一个无效的令牌错误

Posted

技术标签:

【中文标题】Node.js - Express.js JWT 总是在浏览器响应中返回一个无效的令牌错误【英文标题】:Node.js - Express.js JWT always returns an invalid token error in browser response 【发布时间】:2014-03-19 23:06:05 【问题描述】:

我将 node.js 和 express.js 与 express-jwt 模块一起使用,并且我已经设置了一个简单的 HTTP 服务器来测试所有内容:

这是涉及的节点代码:

 app.set('port', process.env.PORT || 3000);
    app.use(express.methodOverride());
    app.use(allow_cross_domain);
    app.use('/api', expressJwt(secret: '09qrjjwef923jnrge$5ndjwk'));
    app.use(express.json());
    app.use(express.urlencoded());
    app.use('/', express.static(__dirname + '/'));
    app.use(function(err, req, res, next)
      if (err.constructor.name === 'UnauthorizedError') 
        res.send(401, 'Unauthorized');
      
    );

    app.get('login',function(req,res)

    //...
    jwt.sign(results.username+results.email, secret,  expiresInMinutes: 9000000000*9393939393393939393939 );
    );

    app.post('api/profile',function(req,res)
     console.log(req.user); // this return undefined in console
     res.send(req.user); // response is pending and dunno why it returns error in browser console
    );

因此,一旦我打开/login URL,我就会登录并将会话令牌发送到api/post,它会在浏览器控制台中返回此响应错误:

"error":"message":"invalid signature","code":"invalid_token","status":401,"inner":

我不明白为什么会这样,因为前端存储的token和JWT中的token是一样的。出现此错误的原因可能是什么?

POSTed 到api/post URL 的标头示例:

【问题讨论】:

你能在jwt.sign中显示“secret”的值吗?另外,results.username + results.email 是 JSON 吗? jwt.sign 接受一个 json 对象。 @woloski 感谢男士回复我,我没有在 sign() 中为 secret var 设置值,因为我认为使用 app.use('/api', expressJwt(secret : '09qrjjwef923jnrge$5ndjwk')); 已经设置好了 :P 我弄错了吗? @woloski 用户不是 json 实际上我需要将其设置为 json 是的,我会尝试的!谢谢 @woloski 尝试使用类似 jwt.sign(JSON.stringify("ops:asd")、secret 等的东西... 但它不起作用:( 它得到 401 但实际上没有更多无效令牌错误消息 @woloski 现在可以使用了!!伙计,你是我的偶像,我没有将 JSON 传递给 sign() 现在一切正常!!!谢谢,只是好奇...... sign() 将令牌存储在哪里? 【参考方案1】:

这是一个例子

http://blog.auth0.com/2014/01/07/angularjs-authentication-with-cookies-vs-token/

var expressJwt = require('express-jwt');
var jwt = require('jsonwebtoken');

var SECRET = 'shhhhhhared-secret';

app.use('/api', expressJwt(secret: SECRET));

app.post('/authenticate', function (req, res) 
  //TODO validate req.body.username and req.body.password
  //if is invalid, return 401
  if (!(req.body.username === 'john.doe' && req.body.password === 'foobar')) 
    res.send(401, 'Wrong user or password');
    return;
  

  var profile = 
    first_name: 'John',
    last_name: 'Doe',
    email: 'john@doe.com',
    id: 123
  ;

  // We are sending the profile inside the token
  var token = jwt.sign(profile, SECRET,  expiresIn: 18000 ); // 60*5 minutes

  res.json( token: token );
);

app.get('/api/protected', 
  function(req, res)   
    res.json(req.user);
  );

【讨论】:

如果我可能会问......将用户的电子邮件放入令牌中是否安全? 对不起,我还有一个问题,如果你可以的话,当我为同一个用户签署一个新令牌并且我在没有过期的情况下签署他们时,旧令牌在哪里以及旧令牌如何令牌被删除?我的意思是创建新令牌时如何删除旧令牌?再次感谢您 我打开了一个您可能感兴趣的新问题 ;) ***.com/questions/21904382/…【参考方案2】:

另外,请确保不要在不记名后添加 :。例如

糟糕! Authorization: Bearer: eyJ0eXAiOiI1NiJ9.eyJpZCMjEyNzk2Njl9.4eU6X1wAQieH 将“UnauthorizedError: jwt must be provided”打印到日志

Authorization: Bearer eyJ0eXAiOiI1NiJ9.eyJpZCMjEyNzk2Njl9.4eU6X1wAQieH

【讨论】:

以上是关于Node.js - Express.js JWT 总是在浏览器响应中返回一个无效的令牌错误的主要内容,如果未能解决你的问题,请参考以下文章

我啥时候应该在独立的 node.js 上使用 express.js

node.js 和 express 的区别

UnhandledPromiseRejectionWarning、Express.js 和 Node.js

jQuery 函数不适用于 node.js 中的 express.js 路由

如何启用调试 express.js/node.js 应用程序

是否可以使用 express.js 清除 node.js 需要缓存?