Nœud et angulaire. J'ai une application d'authentification de pile MEAN dans laquelle je configure un jeton JWT lors d'une connexion réussie comme suit et le stocke dans une session dans le contrôleur. Affectation du jeton JWT à config.headers via l'intercepteur de service:
var token = jwt.sign({id: user._id}, secret.secretToken, { expiresIn: tokenManager.TOKEN_EXPIRATION_SEC });
return res.json({token:token});
authservice.js Interceptor (requestError, response et responseError omis):
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;
}
};
}]);
Maintenant, je voulais obtenir les détails de l'utilisateur connecté à partir du jeton. Comment puis-je le faire? J'ai essayé comme suit, ne fonctionne pas. Quand je consigne l'erreur du fichier Users.js, il dit "ReferenceError: les en-têtes ne sont pas définis"
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');
}
}
}]);
Users.js (Node):
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);
}
Dois-je passer le jeton en tant que paramètre également pour récupérer les détails de l'utilisateur? Ou enregistrer les détails de l'utilisateur dans une variable de session distincte?
Tout d’abord, il est recommandé d’utiliser le middleware Passport pour le traitement des autorisations des utilisateurs. Il faut tout le travail d’analyse de votre demande et fournit de nombreuses options d’autorisation ..___ Maintenant, pour votre code Node.js. Vous devez vérifier et analyser le jeton transmis avec les méthodes jwt, puis rechercher l’utilisateur par l’identifiant extrait du jeton:
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);
}
Rechercher un jeton à partir des données de la demande:
const usertoken = req.headers.authorization;
const token = usertoken.split(' ');
const decoded = jwt.verify(token[1], 'secret-key');
console.log(decoded);
Vous appelez la fonction UserService.me
avec deux rappels, bien que la fonction n’accepte aucun argument. Ce que je pense que vous voulez faire est:
$scope.me = function() {
UserService.me().then(function(res) {
$scope.myDetails = res;
}, function() {
console.log('Failed to fetch details');
$rootScope.error = 'Failed to fetch details';
});
};
Notez également que les méthodes $ http renvoient un objet response . Assurez-vous que ce que vous voulez n'est pas un $scope.myDetails = res.data
Et dans votre fichier Users.js, vous utilisez directement la variable headers.authorization
, alors qu'elle devrait être req.header.authorization
:
var authorization = req.headers.authorization;
Selon la documentation https://github.com/themikenicholson/passport-jwt , vous pouvez utiliser request.user
. Notez que je suppose que vous utilisez passport avec passport-jwt . C'est possible parce que, dans le contexte d'une authentification, passe consiste à définir l'objet de requête et à renseigner la propriété de l'utilisateur. Alors, juste accéder à cette propriété. Vous n'avez pas besoin de faire un middleware.