Я занимаюсь разработкой Angular 6 сети, которая использует rxjs 6 . Я использую вход Google Oauth2 для аутентификации и их клиентской библиотеки gapi . Эта библиотека gapi имеет метод для входа в систему , который возвращает объект типа GoogleUser , который имеет метод для обновления его токена , напримерметод называется reloadAuthResponse () , который возвращает обещание с новым access_token .
Теперь, что я хочу сделать в моем перехватчике в Angular, это когда я получаюОтвет с кодом 401, я должен вызвать вышеупомянутый метод, чтобы обновить токен доступа и затем повторить вызов. У меня возникли две проблемы:
- Поскольку метод токена обновления возвращает обещание, я не знаю, как его обработать, чтобы повторить мой исходный запрос.
- Код внутри tap выполняется дважды.
Мой код перехватчика таков:
public intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
request = request.clone({
setHeaders: {
Authorization: `Bearer ${this._sesionService.getAccessToken()}`
}
});
console.log(request.url)
return next.handle(request)
.pipe(
tap((event: HttpEvent<any>) => {
console.log("todo va bien")
return event;
}, (error: HttpErrorResponse) => {
console.log("mal")
console.log(error)
// Solicitamos un nuevo token para que no nos cierre sesion
if (error.status == 401) {
console.log("solicitando nuevo token")
this._sesionService.getGoogleUser().reloadAuthResponse()
.then((authResponse: AuthResponse) => {
console.log("nuevo token")
console.log(authResponse)
this._sesionService.setAccessToken(authResponse.access_token);
console.log(authResponse.access_token)
return next.handle(request);
}).catch(e => {
console.log("jajajaja")
console.log(e)
});
}
})
);
}
Что мне нужно изменить, чтобы это исправить?
Спасибо!