在触发请求之前刷新侦听器中的令牌

Refresh Token in Interceptor before request is fired

本文关键字:侦听器 令牌 刷新 请求      更新时间:2023-09-26

我的头发拔掉了。如果用户的访问令牌即将过期,我想刷新访问令牌。

authService.isUserLoggedIn()返回一个承诺并检查用户是否已登录。如果不是,则正在刷新用户的访问令牌。

但是,问题是authService.isUserLoggedIn()是异步调用,在返回值之前,拦截器将完成其作业,并且授权标头将不会填充新令牌...

我一直在寻找一种方法来等待承诺解决,然后再继续脚本。不幸的是,我无法完成所需的内容。

法典:

.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 文档:

拦截器利用承诺 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;
    });
}
多亏

了奥列格的建议,我设法让它工作。答案是返回一个承诺,在该承诺中,我们返回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;
        }
      };
    })