2016-02-13 76 views
2

登录后,我向客户端发送JSON Web令牌。我有一个自定义authInterceptor,它将JSON Web令牌发送回服务器端。JWT未解码“JWT格式错误” - 节点角度

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

当我关闭浏览器并返回到站点时,JWT无法解码。 JWT可以在编码功能下进行解码。我已经尝试了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.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); 
    } 
}; 
}); 
+1

你有没有console.logged你的catch块中的错误? –

+0

Noob错误,我应该这样做。这是我得到: {[JsonWebTokenError:jwt malformed]名称:'JsonWebTokenError',消息:'jwt malformed'} –

+1

我不确定这是否是您的问题,但json Web令牌应该是'req.headers.Authorization'的全部内容,所以当你分割('。')'并且抓取索引1的元素时,这实际上是有效载荷,所以你有变量'token'指向负载而不是完整的智威汤逊。如果你之前还没有和JWT合作过,[这篇文章](http://www.toptal.com/web/cookie-free-authentication-with-json-web-tokens-an-example-in-laravel- and-angularjs)对他们有很好的解释。 –

回答

5

很高兴你明白了!后代的问题如下:JWT包含三个组件,一个标题,有效负载和签名(a good, thorough explanation can be found in this toptal post),所以当您将JWT拆分为具有var token = req.headers.authorization.split('.')的组件时,将分配给token的值只有有效载荷,而不是完整的JWT。

由于jwt-simple解码方法需要完整的令牌,并且您只给它有效负载进行评估,所以您的代码正在触发'jwt malformed'错误。在你的情况下,因为你在授权标题前加上了Bearer,你可以用var token = req.headers.authorization.split(' ')代替完整的标记。

+1

有帮助。谢谢 – grant