把头发拉出来。如果用户的访问令牌即将到期,我想刷新访问令牌。
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;
}
};
});
答案 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;
}
};
})