簡體   English   中英

在觸發請求之前刷新Interceptor中的令牌

[英]Refresh Token in Interceptor before request is fired

把頭發拉出來。 如果用戶的訪問令牌即將到期,我想刷新訪問令牌。

authService.isUserLoggedIn()返回一個promise並檢查用戶是否已登錄。 如果不是,則刷新用戶的訪問令牌。

但問題是authService.isUserLoggedIn()是異步調用,在它返回值之前,攔截器將完成其作業,並且不會使用新標記填充Authorization標頭...

在腳本繼續之前,我一直在尋找一種等待承諾解決的方法。 不幸的是,我無法完成所需的任務。

碼:

.factory('SEHttpInterceptor', function($injector, ngWebApiSettings) {
    return {
        // optional method
        'request': function(config) {

          // add Authorization header if available
          if (config.url.indexOf(ngWebApiSettings.apiServiceBaseUri) >-1){
            var authService = $injector.get('authService2');
              authService.isUserLoggedIn().then(function(response){
                var authData = $injector.get('$localStorage').getObject("authorizationData");
                config.headers.Authorization = 'Bearer ' + authData.token;
              });
          }   
          return config;
        }
      };
});

來自AngularJS $ http文檔

攔截器利用promise API來滿足同步和異步預處理的這種需求。

request :使用http配置對象調用攔截器。 該函數可以自由修改配置對象或創建新對象。 該函數需要直接返回配置對象,或者包含配置或新配置對象的promise。

我假設你可以簡單地說:

'request': function(config) {

    if (config.url.indexOf(ngWebApiSettings.apiServiceBaseUri) === -1){
        return config;
    }

    var authService = $injector.get('authService2');
    return authService.isUserLoggedIn().then(function(response){
        var authData = $injector.get('$localStorage').getObject("authorizationData");
        config.headers.Authorization = 'Bearer ' + authData.token;
        return config;
    });

}

感謝Oleg的建議,我設法讓這個工作。 答案是返回一個promise,我們在其中返回config密鑰。

.factory('SEHttpInterceptor', function($injector, ngWebApiSettings) {
     return {
        // optional method
        'request': function(config) {

          // add Authorization header if available
          if (config.url.indexOf('/Token')== -1 && config.url.indexOf(ngWebApiSettings.apiServiceBaseUri) >-1){
            var authService = $injector.get('authService2');
              return authService.isUserLoggedIn().then(function(response){
                var authData = $injector.get('$localStorage').getObject("authorizationData");
                config.headers.Authorization = 'Bearer ' + authData.token;
                return config;
              });
          }   
          return config;
        }
      };
    })

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM