【发布时间】: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”的部分并给我令牌!如果你想输入答案,我会给你功劳。
标签: javascript angularjs node.js express jwt