在触发请求之前刷新Interceptor中的令牌

Chr*_*zak 7 javascript angularjs

把头发拉出来.如果用户的访问令牌即将到期,我想刷新访问令牌.

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;
        }
      };
});
Run Code Online (Sandbox Code Playgroud)

Chr*_*zak 0

感谢奥列格的建议,我成功地完成了这项工作。答案是返回一个承诺,在这个承诺内我们返回密钥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;
        }
      };
    })
Run Code Online (Sandbox Code Playgroud)