gpt4 book ai didi

angularjs - 拦截器中的无限循环

转载 作者:行者123 更新时间:2023-12-04 15:10:18 25 4
gpt4 key购买 nike

我制作了一个使用 API 的 AngularJS 网站。此 API 提供的功能很少,例如身份验证 (Oauth)。

当 API 返回 401 错误时,表示 access_token已过期,需要使用 refresh_token 刷新.

我在 AngularJS 中创建了一个拦截器。它的目标是检查 API 返回的结果是否为 401 错误,如果是,则必须刷新 token ,然后处理先前被拒绝的请求。

问题是拦截器创建了一个无限循环。在初始请求第二次失败后,它应该停止,但它没有。

angular.module('myApp')
.factory('authInterceptor', function ($rootScope, $q, $window, $injector) {

return {

// If the API returns an error
'responseError' : function(rejection) {

// If it's a 401
if (rejection.status == 401) {

var deferred = $q.defer();

$injector.get('$http').post('http://my-api.local/api/oauth/token', {
grant_type : 'refresh_token',
client_id : 'id',
client_secret : 'secret',
refresh_token : $window.sessionStorage.refresh_token
}, {
headers : {
'Content-Type' : 'application/x-www-form-urlencoded'
},
transformRequest : function(obj) {
var str = [];
for(var p in obj)
str.push(encodeURIComponent(p) + "=" + encodeURIComponent(obj[p]));
return str.join("&");
}
})
// New token request successfull
.success(function(refreshResponse) {

// Processing the failed request again (should fail again because I didn't saved the new tokens)
$injector.get('$http')(rejection.config).success(function(data) {

deferred.resolve(data);

})
.error(function(error, status) {

deferred.reject();

});

return deferred.promise();

})
// New token request failure
.error(function(error, status) {

deferred.reject();
// $location.path('users/login');

return;

});

}
// If it's another errorenter code here
else
return rejection;

}

}

});

所以这段代码:
  • 当第一个请求失败时启动
  • 刷新 token
  • 重试请求但再次失败(<- 我只想让它在这里停止)
  • 刷新 token
  • 重试请求但再次失败
  • 刷新 token
  • 重试请求但再次失败
  • 等等...
  • 最佳答案

    我在我的应用程序中处理过这个问题。您的刷新请求需要包含一个 config/header 变量,如 skipIntercept: true .然后当你截获它作为失败的响应时,你可以检查rejection.config.skipIntercept多变的。如果是真的,你直接去$q.reject(rejection) .

    你有:

    if (rejection.status == 401) {

    将其更改为:
    if (rejection.status == 401 && !rejection.config.skipIntercept) {

    然后在此之上:
         headers : {
    'Content-Type' : 'application/x-www-form-urlencoded'
    },

    您需要添加:
         skipIntercept: true,

    headers: {
    'Content-Type' : 'application/x-www-form-urlencoded'
    },

    附注。 there's an existing solution您可以使用。

    关于angularjs - 拦截器中的无限循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30607750/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com