我有auth拦截器和JWT身份验证。 当令牌过期时我得到401并且我需要发送刷新令牌的请求。 令牌刷新后,我想重新发送用户请求,但它无法正常工作。
例如,要转到我的帐户标签,用户需要拥有有效令牌,他点击我的帐户并获取401,然后发送刷新令牌,并将有效令牌保存在本地存储中。
现在我希望在此之后拦截器自动执行用户操作,在这种情况下转到我的帐户但我的方式不起作用,我该怎么办?
拦截器:
'responseError': function(rejection) {
var $state = $injector.get('$state');
var deffer = $q.defer();
if (rejection.status === 401) {
var $http = $injector.get('$http');
var AuthService = $injector.get('AuthService');
var user = store.get('user');
var cred = AuthService.refreshTokenValue(user.secretId, user.secretClient, user.refreshToken);
AuthService.getRefreshToken(cred).then(function(res) {
UserService.oAuth.accessToken = res.data.access_token;
// here i want to resend the request
return deffer.resolve(rejection);
});
}
return $q.reject(rejection);
}
答案 0 :(得分:0)
你应该先创建一个promise对象,然后使用$ http(rejection.config)返回重试请求, 根据您的授权程序解决或拒绝承诺。
示例代码
var $state = $injector.get('$state');
var retryRequest = function($http, config, deferred) {
function successCallback(response) {
deferred.resolve(response);
}
function errorCallback(response) {
deferred.reject(response);
}
$http(config).then(successCallback, errorCallback);
}
if (rejection.status === 401) {
var deferred = $q.defer(); //moved deferred to here
var $http = $injector.get('$http');
var AuthService = $injector.get('AuthService');
var user = store.get('user');
var cred = AuthService.refreshTokenValue(user.secretId, user.secretClient, user.refreshToken);
AuthService.getRefreshToken(cred).then(function(res) {
UserService.oAuth.accessToken = res.data.access_token;
retryRequest($http, rejection.config, deferred);
// here i want to resend the request
return deffer.resolve(rejection);
});
return deferred.promise;
}
return $q.reject(rejection);
但是你应该更好地使用httpBuffer对请求进行排队,并在授权成功后重试所有请求
编辑:您可以使用类似https://github.com/witoldsz/angular-http-auth/blob/master/src/http-auth-interceptor.js
的内容