登录后,我会向客户端发送一个JSON Web Token。我有一个自定义的authInterceptor,它将JSON Web Token发送回服务器端。当我登录时,一切都正常。转到不同的子页面,非常好用。这是因为我有一个函数,它检查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-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);
}
};
});
req.headers.Authorization
的整个内容,因此当您split('.')
并获取索引为 1 的元素时,实际上是负载,所以您拥有将变量token
引用到负载而不是完整的 JWT。如果您之前没有使用过 JWT,此 toptal 文章 对它们有很好的解释。 - Bennett Adamsvar token = req.headers.authorization.split('.')[1];
但实际上应该改成:var token = req.headers.authorization.split(' ')[1];
这样就可以把Bearer那部分去掉,只保留token了!如果你想手打答案的话,我会给你相应的奖励。 - Les Paul