我正在开发一个Web应用程序,我正在尝试为安全性实现jwt身份验证。我将生成的令牌发送到客户端并将其保存在标头中,但是当我发送 http请求时,标头在服务器端显示为空。
这是登录模块的服务器端代码部分。
var profile = {
name:rows[0].name,
email:rows[0].email,
role:rows[0].role_id
};
var token = jwt.sign(profile,'shhhhhhared-secret',{expiresInMinutes: 60*5 });
res.json({
success: true,
user: rows[0], //userobject
token: token
});
这是我们在sesssionstorage中设置响应的控制器部分。
dbServices.UserAuthenticate($scope.email,
$scope.password).then(function(response) {
$rootScope.showLoader = false;
if (response.data.success) {
var session_data = {
'token':response.data.token,
'user':{
'name':response.data.user.name,
'role':response.data.user.role_id,
'email':response.data.user.email
}
};
sessionStorage.sessionData = JSON.stringify(session_data);
$location.path('/');
} else {
$scope.msg = 'Invalid Email or Password!'
}
})
这是我正在设置标题的配置文件
App.factory('authInterceptor', ['$rootScope', '$q', '$window',
function($rootScope, $q, $window) {
return {
request: function(req) {
req.headers = req.headers || {};
if (sessionStorage.sessionData.token) {
req.headers.Authorization = 'Bearer ' + sessionStorage.sessionData.token;
}
return req;
},
response: function(response) {
if (response.status == 401) {
console.log('header auth 401 login');
$window.location = '/login';
}
return response || $q.when(response);
}
}
}
]);
App.config(function ($httpProvider) {
$httpProvider.interceptors.push('authInterceptor');
});
我不知道这是怎么回事。任何人都可以帮助我。
答案 0 :(得分:0)
保存令牌时您JSON.stringify(session_data)
但在阅读之前没有JSON.parse(sessionStorage.sessionData)
。
尝试更改
if (sessionStorage.sessionData.token) {
req.headers.Authorization = 'Bearer ' + sessionStorage.sessionData.token;
}
带
var session_data = JSON.parse(sessionStorage.sessionData);
if (session_data.token) {
req.headers.Authorization = 'Bearer ' + session_data.token;
}