webentwicklung-frage-antwort-db.com.de

NodeJs - Benutzerinformationen vom JWT-Token abrufen?

Knoten und Winkel. Ich habe eine MEAN-Stack-Authentifizierungsanwendung, bei der ich bei erfolgreicher Anmeldung ein JWT-Token wie folgt einstelle und in einer Sitzung im Controller speichere. Zuweisen des JWT-Tokens zu config.headers über Service Interceptor:

var token = jwt.sign({id: user._id}, secret.secretToken, { expiresIn: tokenManager.TOKEN_EXPIRATION_SEC });
            return res.json({token:token});

authservice.js Interceptor (ohne requestError, Response und 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;
            }               
        };
    }]);

Jetzt wollte ich die angemeldeten Benutzerdaten vom Token abrufen. Wie kann ich das tun? Ich habe wie folgt versucht, nicht zu funktionieren. Wenn ich den Fehler in der Datei Users.js protokolliere, heißt es: "ReferenceError: Header ist nicht definiert"

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 (Knoten):

 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);
}

Muss ich das Token auch als Parameter übergeben, um die Benutzerdetails abzurufen? Oder speichern Sie die Benutzerdetails auch in einer separaten Sitzungsvariablen?

11
Sri7

Zunächst sollte die Passport-Middleware für die Benutzerautorisierung verwendet werden. Es nimmt all den schmutzigen Job des Parsens Ihrer Anfrage und bietet auch viele Berechtigungsoptionen. Jetzt für Ihren Node.js-Code. Sie müssen das übergebene Token mit jwt-Methoden überprüfen und analysieren und dann den Benutzer anhand der aus dem Token extrahierten ID suchen:

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);
}
16

Token aus Anforderungsdaten suchen: 

const usertoken = req.headers.authorization;
const token = usertoken.split(' ');
const decoded = jwt.verify(token[1], 'secret-key');
console.log(decoded);
3
Ajay yadav

Sie rufen die Funktion UserService.me mit zwei Callbacks auf, obwohl die Funktion keine Argumente akzeptiert. Was ich denke, möchten Sie tun:

$scope.me = function() {
    UserService.me().then(function(res) {
      $scope.myDetails = res;
    }, function() {
      console.log('Failed to fetch details');
      $rootScope.error = 'Failed to fetch details';
    });
  };

Beachten Sie auch, dass die $ http-Methoden ein response-Objekt zurückgeben. Stellen Sie sicher, dass es sich nicht um einen $scope.myDetails = res.data handelt.

In Ihrer Users.js-Datei verwenden Sie die Variable headers.authorization direkt, wobei req.header.authorization die folgende sein sollte:

var authorization = req.headers.authorization;
1
Pedro M. Silva

Entsprechend der Dokumentation https://github.com/themikenicholson/passport-jwt können Sie request.user verwenden. Beachten Sie, ich nehme an, Sie verwenden Passport mit Passport-jwt . Dies ist möglich, weil Passport im Kontext einer Authentifizierung das Anforderungsobjekt setzt und die Benutzereigenschaft auffüllt. Also einfach auf diese Eigenschaft zugreifen. Sie brauchen keine Middleware zu machen. 

0