JWT 未解码“JWT 格式错误”-Node Angular

Posted

技术标签:

【中文标题】JWT 未解码“JWT 格式错误”-Node Angular【英文标题】:JWT not decoding "JWT malformed" - Node Angular 【发布时间】:2016-05-24 08:20:04 【问题描述】:

登录后,我会向客户端发送一个 JSON Web 令牌。我有一个自定义的 authInterceptor,它将 JSON Web 令牌发送回服务器端。

当我登录时,一切正常。转到不同的子页面,效果很好。这是因为我有一个函数可以检查 Passport 身份验证或令牌身份验证,并且在登录时 Passport 身份验证工作。

当我关闭浏览器并返回站点时,JWT 无法解码。当 JWT 放在 encoding 函数下方时,它可以解码。我已经尝试了 jwt-simple 节点模块和 jsonwebtoken 节点模块,但我返回了同样的错误。

这是我的自定义函数,用于检查有效令牌:

function checkAuthentication(req, res, next)
  if (!req.headers.authorization) 
     return res.status(401).send( message: 'Please make sure your request has an Authorization header' );
  
  console.log("Here");
  var token = req.headers.authorization.split('.')[1];
  console.log(token);
  console.log(config.secret);
  var payload = null;
  try 
    console.log("And here....");
    payload = jwt.decode(token, config.secret);
    console.log(payload);
  
  catch (err) 
    console.log(err);
    return false;
  

  if (payload.exp <= moment().unix()) 
    return false;
  
  req.user = payload.sub;
  return true;

jwt-simple 使用jwt.encode()jwt.decode,而jsonwebtoken 使用jwt.sign()jwt.verify()。这是我在控制台中得到的:

Here
eyJzdWIiOiI1NmEyZDk3MWQwZDg2OThhMTYwYTBkM2QiLCJleHAiOjE0NTYxOTEyNzQsImlhdCI6MTQ1NTMyNzI3NH0
VerySecretPhrase
And here....
 [JsonWebTokenError: jwt malformed] name: 'JsonWebTokenError', message: 'jwt malformed'  

这是客户端的 authInterceptor。我收集令牌并将其设置在请求标头中:

app.factory('httpInterceptor', function($q, $store, $window) 
return 
    request: function (config)
        config.headers = config.headers || ;
        if($store.get('token'))
            var token = config.headers.Authorization = 'Bearer ' + $store.get('token');
        
        return config;
    ,
    responseError: function(response)
        if(response.status === 401 || response.status === 403) 
            $window.location.href = "http://localhost:3000/login";
        
        return $q.reject(response);
    
;
);

【问题讨论】:

您是否在控制台中记录了您的 catch 块中的错误? 菜鸟错误,我应该这样做。这就是我得到的: [JsonWebTokenError: jwt malformed] name: 'JsonWebTokenError', message: 'jwt malformed' 我不确定这是否是您的问题,但 json Web 令牌应该是 req.headers.Authorization 的全部内容,所以当您 split('.') 并抓取索引 1 处的元素时,这实际上是有效负载,因此您有变量 token 指的是有效负载而不是完整的 JWT。如果您以前没有使用过 JWT,this toptal post 对它们有很好的解释。 你一针见血!这就是我所拥有的:var token = req.headers.authorization.split('.')[1]; 应该是:var token = req.headers.authorization.split(' ')[1]; 取出“Bearer”的部分并给我令牌!如果你想输入答案,我会给你功劳。 【参考方案1】:

很高兴你明白了!对于后人来说,问题如下:JWT 由三个组件组成,即标头、有效负载和签名 (a good, thorough explanation can be found in this toptal post),因此当您使用 var token = req.headers.authorization.split('.') 将 JWT 拆分为组件时,您的值是分配给token 仅指有效负载,而不是完整的 JWT。

因为 jwt-simple decode 方法需要完整的令牌,而您只给它提供了要评估的有效负载,所以您的代码触发了“jwt malformed”错误。在您的情况下,由于您在 Authorization 标头中使用 Bearer 前面的令牌,因此您可以使用 var token = req.headers.authorization.split(' ') 获取完整的令牌。

【讨论】:

以上是关于JWT 未解码“JWT 格式错误”-Node Angular的主要内容,如果未能解决你的问题,请参考以下文章

UnauthorizedError:身份验证时出现 jwt 格式错误的错误

Json Web Token verify() 返回 jwt 格式错误

JWT-解码需要未定义,jwt解码未定义

如何解码 Java 生成的 Node.js 中的 jwt 令牌?

解码 jwt 时,AuthenticationEvent 未发布错误

JWT 解码返回 null