Angular http拦截器不能应用于由拦截器内初始化的请求?
在我们的代码库中,每个对API的请求都具有以/api/
开头的URL,并且我们有一个拦截器,该拦截器使用我们API的实际地址更新这些请求(使在不同环境下切换更加容易)。
在更新URL后,如果存在访问令牌,则拦截器还会添加Authorization标头。 这一切都非常完美。
但是,有时访问令牌已过期,但我们仍然有一个刷新令牌,在继续进行实际请求之前,我要先向我们的API发出请求以获取新的访问令牌。
因此,在拦截器的request
部分中,我们调用负责刷新访问令牌的服务,并在该方法返回的then
回调函数中更新原始请求的配置:
//This interceptor only applies to our api calls, do nothing for other requests
if(config.url.substring(0, API_PREFIX.length) !== API_PREFIX) {
return config;
}
config.url = config.url.replace(API_PREFIX, API_ENDPOINT);
// if we are authenticated, we add the authorization header already
if(AuthSessionService.isAuthenticated()) {
config.headers['Authorization'] = "Bearer " + AuthSessionService.getAccessToken();
return config;
}
// so we are not authenticated, but we still do have a refresh-token, this means, we should get a new access-token
if(AuthSessionService.hasRefreshToken()) {
var deferred = $q.defer(),
loginService = angular.injector(['MyApp']).get('LoginService');
loginService.refresh().then(function(result) {
config.headers['Authorization'] = "Bearer " + AuthSessionService.getAccessToken();
deferred.resolve(config);
}).catch(function() {
deferred.reject('Failed to refresh access token');
});
return deferred.promise;
}
//no access-token, no refresh-token, make the call without authorization headers
return config;
然而,登录服务发出的请求似乎没有应用拦截器,因此请求会发送到/api/login
而不是实际的API端点。
这是Angular的设计吗?当从拦截器的请求方法中发出新的http请求时,不应用拦截器吗?
loginService
的?我猜它依赖于$http
,对吗?那么这将会是一个循环依赖的问题。我猜解决方法可能导致了你的问题。 - Sergiu Paraschiv$http
返回的 Promise。 - charlietflangular.injector().get('LoginService')
获取的,以避免循环依赖问题。 - schmkr$http
返回的promise),但是没有成功。所以我尝试过这种方法,但还是没有成功。 - schmkr