У меня есть приложение, которое использует шлюз API. Когда пользователь входит в систему, он предоставляет токен, который работает только в течение часа.
Что делает этот шлюз необычным, так это то, что этот токен используется всеми пользователями, а время обновления НЕ является уникальным для сеанса. Он не может быть обновлен в любое время, но имеет установленное время, скажем, 5 минут и 32 секунд в каждый час.
Пока что мне нужно управлять обновлением токена:
// This will get the Gateway Token
getToken = (baseUrl, httpOptions) => {
return this.http.post<oAuthResponse>(baseUrl + 'token', 'grant_type=client_credentials', httpOptions)
}
// this will be called when the token needs to be renewed
renewToken = (baseUrl, httpOptions) => {
this.getToken(baseUrl, httpOptions).subscribe( (res:any) => {
this.keepAlive(res.expires_in)
})
}
// this triggers the renewal at the set time
keepAlive = (t) => {
setTimeout(()=>{
this.setToken()
}, t*1000 )
}
Однако я столкнулся с проблемой, когда мои запросы API возвращают 401 error
, в то время как токен обновляется.
Я бы хотел иметь возможность ставить в очередь другие запросы API, пока вызывается getToken()
или renewToken()
. Таким образом, запросы, сделанные во время возврата этого вызова, ждут, пока он не будет выполнен.
Как бы я go сделал это? Мои текущие запросы API настроены так:
public get = (req:string) => {
const httpOptions = {
headers: new HttpHeaders({
'Content-Type' : 'application/x-www-form-urlencoded',
'Authorization': 'Bearer ' + this.cache.token
})
};
return this.http.get<Response>(this.cache.baseUrl + req, httpOptions)
}