2015-10-31 10 views
9

Węzeł i kątowy. Mam aplikację uwierzytelniania stosu MEAN, w której ustawiam token JWT po pomyślnym zalogowaniu w następujący sposób i zapisuję go w sesji w kontrolerze. Przypisywanie tokenu JWT do config.headers pośrednictwem kolektora usług:NodeJs - Pobieranie informacji o użytkowniku z tokena JWT?

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

authservice.js Interceptor (pominięty requestError, reagowania i 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; 
      }    
     }; 
    }]); 

Teraz chciałem dostać zalogowanych użytkowników ze szczegółami token, Jak mogę to zrobić? Próbowałem w następujący sposób, nie działa. Podczas logowania błąd na Users.js złożyć to powiedzenie "ReferenceError: nagłówki nie jest zdefiniowana"

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 (Węzeł):

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

Czy muszę przekazać token jako parametr również w celu pobrania danych użytkownika? Lub zapisać dane użytkownika w osobnej zmiennej sesji?

Odpowiedz

11

Przede wszystkim, jest to dobrą praktyką korzystania z oprogramowania pośredniego Passport do obsługi autoryzacji użytkowników. Zajmuje całą brudną robotę podczas analizowania żądania, a także zapewnia wiele opcji autoryzacji. Teraz dla twojego kodu Node.js. Trzeba sprawdzić i przeanalizować przekazany znacznik metodami JWT, a następnie znajdź użytkownika przez ID wyodrębnione z tokena:

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

Dziękuję bardzo! Zadziałało. Wystarczy dokonać prostej zmiany dekodowanej = jwt.verify (authorization.split ('') [1], secret.secretToken); ponieważ mam token Bearer + jako mój token. – Srini

+0

Znalazłem więcej zalet korzystania z JWT niż paszportu. Podążam tymi dwoma: http://www.kdelemme.com/2014/03/09/authentication-with-angularjs-and-a-node-js-rest-api/ i http: //code.tutsplus. com/tutoriale/token-based-authentication-with-angularjs-nodejs - cms-22543. Proszę o poradę, czy paszport jest dobrym wyborem. – Srini

+0

Paszport może używać JWT tak samo. To zapewnia wygodną abstrakcję od procedur uwierzytelniania. Mój kod routera dla metod chronionych wygląda następująco: 'app.get ('/ api/content', passport.authenticate ('lokalna autoryzacja', { sesja: false }), api.listContent);' –

1

Twoja funkcja nazywa się UserService.me z dwoma wywołaniami zwrotnymi, chociaż funkcja nie przyjmuje żadnych argumentów. Co myślę, że chcesz zrobić to:

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

Należy również pamiętać, że metody $ http zwracają response object. Upewnij się, że to, co chcesz, nie jest $scope.myDetails = res.data

A w pliku Users.js, używasz zmiennej headers.authorization bezpośrednio, podczas gdy powinno być req.header.authorization:

var authorization = req.headers.authorization; 
+0

Dzięki za sprostowanie mojej funkcji, choć jest to problem zbyt moim głównym problemem nie jest w stanie pobrać token z config.headers. masz jakiś pomysł? – Srini

+0

Przepraszamy, przegapił ten błąd. Sprawdź teraz odpowiedź, aby sprawdzić, czy jest poprawiona. :) –

+0

Poprawiono, problem nadal występuje. W rzeczywistości nie działa na samej instrukcji if w pliku users.js. nawet nie wchodząc do środka. – Srini