2015-10-31 12 views
9

Knoten und eckig. Ich habe eine MEAN-Stack-Authentifizierungsanwendung, bei der ich ein JWT-Token bei erfolgreicher Anmeldung wie folgt setze und es in einer Sitzung im Controller ablege. Zuweisen der JWT-Token config.headers durch Service Interceptor:NodeJs - Benutzerinformationen vom JWT-Token abrufen?

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

authservice.js Interceptor (weggelassen Request, Reaktion 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; 
      }    
     }; 
    }]); 

Nun wollte ich die in Benutzerdaten angemeldet erhalten aus das Token, Wie kann ich das tun? Ich habe es wie folgt versucht, nicht funktioniert. Wenn ich den Fehler von Users.js Log-Datei es sagt:

authController.js "Reference Header nicht definiert":

$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):

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

Antwort

11

Zunächst einmal ist es ein Es empfiehlt sich, Passport-Middleware für die Benutzerautorisierungsbehandlung zu verwenden. Es nimmt all die schmutzige Aufgabe des Parsens Ihrer Anfrage und bietet auch viele Autorisierungsoptionen. Jetzt für Ihren Node.js-Code. Sie müssen überprüfen, und das übergebene Token mit jwt Methoden zu analysieren und dann den Benutzer durch id aus dem Token extrahierte finden:

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

Vielen Dank! Es funktionierte. Machen Sie einfach eine einfache Änderung decided = jwt.verify (authorization.split ('') [1], secret.secretToken); wie ich Bearer + Token als mein Token habe. – Srini

+0

Ich fand mehr Vorteile für die Verwendung von JWT als die Verwendung eines Reisepasses. Ich folge diesen beiden: http://www.kdelemme.com/2014/03/09/authentication-with-angularjs-and-a-node-js-rest-api/ und http: //code.tutsplus. com/tutorials/token-based-authentication-mit-angularjs-nodejs - cms-22543. Bitte beraten Sie, wenn der Pass eine gute Wahl ist. – Srini

+0

Passport kann JWT genauso verwenden. Es bietet Ihnen nur eine bequeme Abstraktion von den Authentifizierungsverfahren. Mein Router-Code für geschützte Methoden sieht so aus: 'app.get ('/ api/content', pass.authenticate ('lokale-autorisierung', { session: false }), api.listContent);' –

1

Sie rufen die Funktion mit zwei Callbacks auf, obwohl die Funktion keine Argumente akzeptiert. Was ich glaube, Sie wollen zu tun ist:

$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 eine response object zurückzukehren. Stellen Sie sicher, dass Sie wollen, was kein $scope.myDetails = res.data

Und in Ihrer Users.js Datei ist, werden Sie die Variable headers.authorization direkt verwenden, während es req.header.authorization sein sollte:

var authorization = req.headers.authorization; 
+0

Dank für meine Funktion zu korrigieren, obwohl dies ein Problem auch mein Hauptproblem ist nicht in der Lage zu rufen Sie das Token von config.headers ab. hast du irgendeine Idee? – Srini

+0

Sorry, diesen Fehler verpasst. Sehen Sie sich die Antwort an, um zu überprüfen, ob sie behoben ist. :) –

+0

Korrigiert, das Problem bleibt bestehen. Tatsächlich versagt es bei der if-Anweisung selbst in users.js. nicht einmal drinnen. – Srini

Verwandte Themen