我一直在很好地实施Angular SPA和JWT,但我总是很难委派新的令牌。
我的基本策略是:
哪个不起作用,因为多个异步调用将触发,一个人将获得委托功能,但是然后刷新令牌将用于第二个并且那个将失败,然后用户将被注销。
其中有一个类似的问题,第一次调用会发现它已过期,并获取新令牌,但由于它是Async,其余的调用将触发并失败等。
这里的基本策略是什么?我觉得应用程序应该做的第一件事就是检查JWT,如果它是一个坏标记,则委托一个新的,但在这种情况下,它不应该是异步的。我是否只是在使用时不删除刷新令牌?
任何帮助都会很棒,我觉得这是我理解中的最后一个主要漏洞。谢谢!
答案 0 :(得分:3)
尝试使用Witold Szczerba's "http interceptor"。
简而言之,第一个失败的http调用触发器,事件和后续调用被推入数组。在事件发生后你有机会做一些逻辑,然后重播失败的电话。
这就是说你可能只需要在实际使用刷新令牌之前进行令牌轮换。例如,请考虑可以添加到this function
的此代码.config(function($httpProvider) {
$httpProvider.interceptors.push(function(moment, $rootScope, $q, httpBuffer) {
return {
request: function (config) {
if ($rootScope.authToken) {
config.headers["Authentication"] = 'Bearer ' + $rootScope.authToken;
var payload = angular.fromJson(atob($rootScope.authToken.split('.')[1]));
var utcNow = moment.utc().valueOf();
// 3600000 ms = 1 hr
if(utcNow > payload.iat + 3600000){
$rootScope.$broadcast('auth:rotateToken', $rootScope.authToken);
}
}
return config;
},
//responseError: ...see Witold's code...
});
})