2015-12-11 18 views
8

Tôi đã thực hiện khá tốt việc thực hiện Angular SPA và JWT, nhưng tôi luôn có một thời gian khó khăn khi ủy nhiệm một mã thông báo mới.Chiến lược cơ bản cho mã thông báo làm mới ủy nhiệm để có được JWT mới

chiến thuật cơ bản của tôi đã được:

  1. Trong auth chặn được Auth Lỗi => Ủy với thẻ làm mới, thay thế JWT, khác logout

nào không làm việc vì nhiều cuộc gọi async sẽ bắn và một sẽ nhận được hàm đại biểu, nhưng sau đó mã thông báo làm mới sẽ được sử dụng cho thẻ thứ hai và mã thông báo đó sẽ không thành công, khi đó người dùng sẽ bị đăng xuất.

  1. Trước khi bất cứ điều gì khác: Kiểm tra ngày hết hạn thẻ, nếu hết hạn => đại biểu với thẻ làm mới, thay thế JWT, khác logout

nào đã có một vấn đề tương tự mà các cuộc gọi đầu tiên sẽ nhận thấy nó đã hết hạn, và lấy mã thông báo mới, nhưng vì nó là Async, phần còn lại của các cuộc gọi sẽ cháy và thất bại, vv.

Chiến lược cơ bản ở đây là gì. Tôi cảm thấy như điều đầu tiên mà ứng dụng nên làm là kiểm tra JWT và ủy nhiệm cho một cái mới nếu đó là một mã thông báo không đúng, nhưng trong trường hợp đó, nó không nên là không đồng bộ. Tôi chỉ không xóa mã thông báo làm mới khi sử dụng?

Bất kỳ trợ giúp nào sẽ tuyệt vời, tôi cảm thấy đây là lỗ hổng lớn cuối cùng trong sự hiểu biết của tôi. Cảm ơn!

+0

kiểm tra https://github.com/caolan/async này –

Trả lời

3

Thử sử dụng Witold Szczerba's "http interceptor".

Tóm lại, trình kích hoạt và sự kiện cuộc gọi http không thành công đầu tiên và các cuộc gọi tiếp theo sẽ bị đẩy vào một mảng. Khi sự kiện bắn bạn có một cơ hội để làm một số logic và sau đó phát lại các cuộc gọi không thành công.

Điều đó nói rằng bạn có thể chỉ cần thực hiện xoay vòng mã thông báo trước khi cần sử dụng mã thông báo làm mới. Ví dụ: xem xét mã này có thể được thêm vào this function

.config(function($httpProvider) { 
    $httpProvider.interceptors.push(function(moment, $rootScope, $q, httpBuffer) { 
     return { 
      request: function (config) { 
       if ($rootScope.authToken) { 
        config.headers["Authentication"] = 'Bearer ' + $rootScope.authToken; 
        var payload = angular.fromJson(atob($rootScope.authToken.split('.')[1])); 
        var utcNow = moment.utc().valueOf(); 
        // 3600000 ms = 1 hr 
        if(utcNow > payload.iat + 3600000){ 
         $rootScope.$broadcast('auth:rotateToken', $rootScope.authToken); 
        } 
       } 

       return config; 
      }, 
      //responseError: ...see Witold's code... 
    }); 
}) 
Các vấn đề liên quan