2015-10-31 26 views
9

Nút và Góc. Tôi có một ứng dụng xác thực ngăn xếp MEAN nơi tôi đang thiết lập mã thông báo JWT khi đăng nhập thành công như sau và lưu trữ nó trong một phiên trong bộ điều khiển. Gán token JWT để config.headers thông qua dịch vụ đánh chặn:NodeJs - Truy xuất thông tin người dùng từ mã thông báo JWT?

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

authservice.js Interceptor (bỏ qua requestError, phản ứng và 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; 
      }    
     }; 
    }]); 

Bây giờ tôi muốn có được đăng nhập chi tiết người dùng từ mã thông báo, Tôi có thể làm như thế nào? Tôi đã cố gắng như sau, không làm việc. Khi tôi đăng nhập lỗi từ Users.js nộp nó nói "ReferenceError: tiêu đề không được định nghĩa"

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 (Nút):

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

Tôi có phải chuyển mã thông báo làm thông số để truy xuất chi tiết người dùng không? Hoặc lưu chi tiết người dùng trong một biến phiên riêng biệt?

Trả lời

11

Trước hết, đó là một thực hành tốt để sử dụng phần mềm trung gian hộ chiếu để xử lý ủy quyền người dùng. Phải mất tất cả các công việc bẩn phân tích cú pháp yêu cầu của bạn và cũng cung cấp nhiều tùy chọn ủy quyền. Bây giờ cho mã Node.js của bạn. Bạn cần phải xác minh và phân tích các dấu hiệu thông qua với phương pháp JWT và sau đó tìm người dùng bằng cách id chiết xuất từ ​​các mã thông báo:

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

Cảm ơn bạn rất nhiều! Nó đã làm việc. Chỉ cần thực hiện một thay đổi đơn giản được giải mã = ​​jwt.verify (authorization.split ('') [1], secret.secretToken); vì tôi có mã thông báo Bearer + làm mã thông báo của mình. – Srini

+0

Tôi tìm thấy nhiều lợi thế hơn khi sử dụng JWT thay vì sử dụng hộ chiếu. Tôi đang theo dõi hai điều sau: http://www.kdelemme.com/2014/03/09/authentication-with-angularjs-and-a-node-js-rest-api/ và http: //code.tutsplus. com/tutorials/token-based-authentication-với-angularjs-nodejs - cms-22543. Xin vui lòng tư vấn nếu hộ chiếu là một lựa chọn tốt. – Srini

+0

Hộ chiếu có thể sử dụng JWT giống nhau. Nó chỉ cung cấp cho bạn một sự trừu tượng thuận tiện từ các thủ tục xác thực. Mã bộ định tuyến của tôi cho các phương thức được bảo vệ giống như sau: 'app.get ('/ api/content', passport.authenticate ('ủy quyền cục bộ', { phiên: false }), api.listContent);' –

1

Bạn đang gọi hàm UserService.me với hai cuộc gọi lại, mặc dù hàm không chấp nhận bất kỳ đối số nào. Những gì tôi nghĩ bạn muốn làm là:

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

Ngoài ra, hãy lưu ý rằng phương thức $ http trả lại response object. Hãy chắc chắn rằng những gì bạn muốn không phải là một $scope.myDetails = res.data

Và trong tập tin Users.js của bạn, bạn đang sử dụng biến headers.authorization trực tiếp, trong khi đó nó phải được req.header.authorization:

var authorization = req.headers.authorization; 
+0

Cám ơn chỉnh chức năng của tôi, mặc dù điều này là một vấn đề quá vấn đề chính của tôi là không thể lấy mã thông báo từ config.headers. bạn còn ý kiến ​​nào không? – Srini

+0

Rất tiếc, đã bỏ lỡ lỗi đó. Xem câu trả lời ngay bây giờ để kiểm tra xem nó đã được sửa chưa. :) –

+0

Đã khắc phục sự cố, vấn đề vẫn tồn tại. Trong thực tế, nó không thành công ở câu lệnh if trong users.js. thậm chí không đi vào bên trong. – Srini

Các vấn đề liên quan