NodeJs-получить информацию пользователя из токена JWT?
узел и угловые. У меня есть среднее приложение аутентификации стека, где я устанавливаю токен JWT при успешном входе в систему следующим образом и сохраняю его в сеансе в контроллере. Назначение маркера JWT config.заголовки через перехватчик услуги:
var token = jwt.sign({id: user._id}, secret.secretToken, { expiresIn: tokenManager.TOKEN_EXPIRATION_SEC });
return res.json({token:token});
authservice.перехватчик js (опущены requestError,ответ и responseError):
authServices.factory('TokenInterceptor', ['$q', '$window', '$location','AuthenticationService',function ($q, $window, $location, AuthenticationService) {
return {
request: function (config) {
config.headers = config.headers || {};
if ($window.sessionStorage.token) {
config.headers.Authorization = 'Bearer ' + $window.sessionStorage.token;
}
return config;
}
};
}]);
теперь я хотел получить зарегистрированные данные пользователя из токена, как я могу это сделать? Я попытался следующим образом, а не рабочий. Когда я регистрирую ошибку от пользователей.JS-файл говорит: "ReferenceError: заголовки не определены"
authController.js:
$scope.me = function() {
UserService.me(function(res) {
$scope.myDetails = res;
}, function() {
console.log('Failed to fetch details');
$rootScope.error = 'Failed to fetch details';
})
};
authService.js:
authServices.factory('UserService',['$http', function($http) {
return {
me:function() {
return $http.get(options.api.base_url + '/me');
}
}
}]);
пользователи.js (узел):
exports.me = function(req,res){
if (req.headers && req.headers.authorization) {
var authorization =req.headers.authorization;
var part = authorization.split(' ');
//logic here to retrieve the user from database
}
return res.send(200);
}
должен ли я передать токен в качестве параметра для получения сведений о пользователе? Или сохраните данные пользователя в отдельной переменной сеанса?
2 ответов
прежде всего, рекомендуется использовать промежуточное ПО Passport для обработки авторизации пользователя. Это занимает всю грязную работу по разбору вашего запроса, а также предоставляет множество вариантов авторизации. Теперь для вашего узла.код js. Вам нужно проверить и проанализировать переданный токен с помощью методов jwt, а затем найти пользователя по идентификатору, извлеченному из токена:
exports.me = function(req,res){
if (req.headers && req.headers.authorization) {
var authorization = headers.authorization,
decoded;
try {
decoded = jwt.verify(authorization, secret.secretToken);
} catch (e) {
return res.status(401).send('unauthorized');
}
var userId = decoded.id;
// Fetch the user by id
User.findOne({_id: userId}).then(function(user){
// Do something with the user
return res.send(200);
});
}
return res.send(500);
}
вы вызываете функцию UserService.me
С двумя обратными вызовами, хотя функция не принимает никаких аргументов. То, что я думаю, вы хотите сделать, это:
$scope.me = function() {
UserService.me().then(function(res) {
$scope.myDetails = res;
}, function() {
console.log('Failed to fetch details');
$rootScope.error = 'Failed to fetch details';
});
};
также обратите внимание, что методы $http возвращают ответ объекта. Убедитесь, что вы хотите не $scope.myDetails = res.data
и в ваших пользователей.JS файл, вы используете переменную headers.authorization
непосредственно, тогда как это должно быть req.header.authorization
:
var authorization = req.headers.authorization;