gpt4 book ai didi

Angularjs:在 $http 拦截器中发出另一个 $http 请求

转载 作者:行者123 更新时间:2023-12-02 01:25:25 25 4
gpt4 key购买 nike

我有一个简单的(完成一半的)http 拦截器,它将 Bearer token (存储在 $window.sessionsStorage 中)附加到 header ,以便 REST API 请求可以已验证:

function accessTokenHttpInterceptor($window, $http) {

// Try to get token details from sessionStorage
var accesstoken=$window.sessionStorage.getItem('userInfo-accesstoken');
var refreshtoken=$window.sessionStorage.getItem('userInfo-refreshtoken');
var tokenexpiry=$window.sessionStorage.getItem('userInfo-tokenexpiry');

return {

request: function($config) {

// Check if the access token, refresh token and expiry date exists:
if (accesstoken == undefined || refreshtoken == undefined || tokenexpiry == undefined) {
console.log('Missing token details');
// TODO REDIRECT TO LOGIN PAGE
}

// We have an access token. Has it expired?
var expiry = new Date($window.sessionStorage['userInfo-tokenexpiry'])
var now = new Date
if (now > expiry ) {
console.log('Token expired');
// TODO REFRESH THE TOKEN
};

// Set the authorization header
$config.headers['Authorization'] = 'Bearer ' + accesstoken;
return $config;

},
};
}

accessTokenHttpInterceptor.$inject=['$window'];

function httpInterceptorRegistry($httpProvider) {
$httpProvider.interceptors.push('accessTokenHttpInterceptor');
}

angular
.module('myApp')
.config(httpInterceptorRegistry)
.factory('accessTokenHttpInterceptor', accessTokenHttpInterceptor)

如您所见,我能够在调用 API 之前查看 token 是否已过期。

任何人都可以帮助我在发出实际 API 请求之前如何刷新 token 吗?我认为发出另一个 $http 请求会再次被拦截并最终陷入无限循环。通过向 API 发出 POST 请求来刷新 token ,刷新 token 作为参数传递,而不是像其他 API 请求一样在授权 header 中传递。

最佳答案

您可以检查请求的 url 以防止无限循环。此外,您可以返回一个使用它解析的 promise ,而不是直接返回配置,这样您就可以等到获得有效 token 。例如

{
request: function(config) {
if(config.url != 'my/refresh/url') {
var promiseToHaveValidToken;

var expiry = new Date($window.sessionStorage['userInfo-tokenexpiry']);
var now = new Date();
if (now > expiry ) {
promiseToHaveValidToken = $http.get('my/refresh/url').then(function (response) {
return response.data.token;
});
} else {
promiseToHaveValidToken = $q.resolve(sessionStorage['userInfo-accesstoken']);
}

return promiseToHaveValidToken.then(function (token) {
config.headers['Authorization'] = 'Bearer ' + token;
return config;
});
}
}
}

关于Angularjs:在 $http 拦截器中发出另一个 $http 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37381597/

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