2015-10-31 56 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代碼。 您需要驗證,並與智威湯遜方法解析傳遞的令牌,然後找到ID的用戶從令牌提取:

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

非常感謝!有效。只需要做一個簡單的更改解碼= jwt.verify(authorization.split('')[1],secret.secretToken);因爲我有持票人+令牌作爲我的代幣。 – Srini

+0

我發現使用JWT而不是使用護照更有優勢。我遵循這兩個:http://www.kdelemme.com/2014/03/09/authentication-with-angularjs-and-a-node-js-rest-api/和http://code.tutsplus。 COM /教程/基於令牌的認證與 - angularjs-的NodeJS - CMS-22543。如果護照是一個不錯的選擇,請諮詢。 – Srini

+0

護照可以使用JWT一樣。它只是爲您提供了一個方便的認證過程抽象。 我的受保護方法的路由器代碼如下所示: 'app.get('/ api/content',passport.authenticate('local-authorization',{ session: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

更正它,仍然問題依然存在。實際上它在user.js中的if語句本身是失敗的。甚至沒有進入內部。 – Srini