2015-10-31 4 views
9

Узел и угловой. У меня есть приложение проверки подлинности стека MEAN, где я устанавливаю токен JWT при успешном входе в систему следующим образом и сохраняю его в сеансе в контроллере. Назначение маркеров JWT к config.headers через сервис перехватчик:NodeJs - Извлечение информации пользователя из токена JWT?

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

authservice.js перехватчик (опущено RequestError, реакцию и 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; 
      }    
     }; 
    }]); 

Теперь я хотел бы получить вошедшую информацию о пользователях из токен, как я могу это сделать? Я пробовал сделать следующее, не работая. Когда я вхожу ошибку от Users.js файл, он говорит "ReferenceError: заголовки не определен"

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 (Узел):

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

Нужно ли передавать токен в качестве параметра для получения сведений о пользователе? Или сохранить данные пользователя в отдельной переменной сеанса?

ответ

11

Прежде всего, это хорошая практика использования промежуточного ПО Passport для обработки авторизации пользователей. Требуется вся грязная работа по разбору вашего запроса, а также предоставляется множество вариантов авторизации. Теперь для вашего кода Node.js. Вам необходимо проверить и проанализировать пройденную фишку с методами JWT, а затем найти пользователь по идентификатору извлеченного из маркеров:

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

Большое спасибо! Это сработало. Просто нужно сделать простое изменение decoded = jwt.verify (authorization.split ('') [1], secret.secretToken); поскольку у меня есть маркер Bearer + в качестве моего токена. – Srini

+0

Я нашел больше преимуществ для использования JWT вместо использования паспорта. Я следую этим двум: http://www.kdelemme.com/2014/03/09/authentication-with-angularjs-and-a-node-js-rest-api/ и http: //code.tutsplus. ком/учебники/маркер-аутентификацию-с-angularjs-nodejs основе - CMS-22543. Пожалуйста, совет, если паспорт является хорошим выбором. – Srini

+0

Паспорт может использовать JWT точно так же. Он просто предоставляет вам удобную абстракцию от процедур аутентификации. Мой код маршрутизатора для защищенных методов выглядит так: 'app.get ('/ api/content', passport.authenticate ('local-authorization', { сеанс: false }), api.listContent);' –

1

Вы вызываете функцию UserService.me с двумя обратными вызовами, хотя функция не принимает никаких аргументов. То, что я думаю, что вы хотите сделать, это:

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

Кроме того, обратите внимание, что методы $ HTTP возвращают response object. Убедитесь в том, что вы хотите, не $scope.myDetails = res.data

И в вашем Users.js файл, вы используете переменную headers.authorization непосредственно, в то время как она должна быть req.header.authorization:

var authorization = req.headers.authorization; 
+0

Спасибо за исправление моей функции, хотя это проблема тоже моя основная проблема не в состоянии получить токен из config.headers. у тебя есть идеи? – Srini

+0

Простите, пропустили эту ошибку. См. Ответ, чтобы проверить, исправлено ли это. :) –

+0

Исправлено, все еще проблема сохраняется. На самом деле он не работает в самом утверждении if в users.js. нет даже внутри. – Srini

Смежные вопросы