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

时间:2015-01-17 20:48:16

标签: 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;
        }
      };
});

2 个答案:

答案 0 :(得分:2)

来自AngularJS $http documentation

  

拦截器利用promise API来满足同步和异步预处理的需求。

     

request:使用http配置对象调用拦截器。该函数可以自由修改配置对象或创建新对象。该函数需要直接返回config对象,或者包含config或新配置对象的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;
    });

}

答案 1 :(得分:0)

感谢Oleg的建议,我设法让这个工作。答案是返回一个承诺,我们在其中返回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;
        }
      };
    })