2015-10-31 25 views
9

Nodo e angolare. Ho un'applicazione di autenticazione dello stack MEAN in cui sto impostando un token JWT all'accesso correttamente come segue e memorizzandolo in una sessione nel controller. Assegnare il token JWT per config.headers attraverso il servizio intercettore:NodeJs - Recupera infor utente dal token JWT?

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

authservice.js Interceptor (omesso requestError, di risposta e 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; 
      }    
     }; 
    }]); 

Ora volevo ottenere il loggato dettagli utente da il token, come posso farlo? Ho provato come segue, non funziona. Quando annoto l'errore da Users.js depositarne sta dicendo "ReferenceError: intestazioni non è definita"

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

devo passare il token come parametro troppo per recuperare i dati utente? O salvare anche i dettagli dell'utente in una variabile di sessione separata?

risposta

11

Prima di tutto, si tratta di una buona pratica per utilizzare il middleware Passport per la gestione delle autorizzazioni degli utenti. Ci vuole tutto il lavoro sporco di analizzare la tua richiesta e fornisce anche molte opzioni di autorizzazione. Ora per il codice Node.js. È necessario verificare e analizzare il token passato con metodi JWT e poi trovare l'utente per ID estratto dal token:

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

Grazie mille! Ha funzionato. Basta fare una semplice modifica decodificata = jwt.verify (authorization.split ('') [1], secret.secretToken); come ho un token Bearer + come mio token. – Srini

+0

Ho trovato più vantaggi nell'utilizzo di JWT anziché utilizzare il passaporto. Sto seguendo questi due: http://www.kdelemme.com/2014/03/09/authentication-with-angularjs-and-a-node-js-rest-api/ e http: //code.tutsplus. com/tutorial/token-autenticazione-con-angularjs-nodejs base - CMS-22543. Si prega di avvisare se il passaporto è una buona scelta. – Srini

+0

Il passaporto può usare JWT allo stesso modo. Ti fornisce solo una comoda astrazione dalle procedure di autenticazione. Il mio codice router per i metodi protetti è il seguente: 'app.get ('/ api/content', passport.authenticate ('local-authorization', { session: false }), api.listContent);' –

1

Si sta chiamando la funzione UserService.me con due callback, sebbene la funzione non accetti argomenti. Quello che penso che si vuole fare è:

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

Si noti inoltre che i metodi di $ http restituiscono un response object. Assicurarsi che ciò che si vuole non è un $scope.myDetails = res.data

E nel file Users.js, si utilizza la variabile headers.authorization direttamente, mentre dovrebbe essere req.header.authorization:

var authorization = req.headers.authorization; 
+0

Grazie per correggere la mia funzione, anche se questo è un problema troppo il mio problema principale non è in grado di recuperare il token da config.headers. hai qualche idea? – Srini

+0

Spiacente, ho sbagliato quell'errore. Guarda la risposta ora per verificare se è stata riparata. :) –

+0

Correggendolo, il problema persiste. In effetti, non funziona sull'istruzione if stessa in users.js. nemmeno entrando dentro. – Srini

Problemi correlati