#angular #typescript #ionic-framework #ionic3
#angular #typescript #ionic-framework #ionic3
Вопрос:
У меня есть приложение Ionic 3, которое использует токен обновления. Проблема в том, что при создании нового токена доступа представление не обновляется. Другой случай, когда сценарий представляет собой обновление сервера, запрос больше не выполняется.
Angular: 5.2.7
RxJS: 5.5.6
Я изучил некоторые коды, в которых он используется switchMap()
, но я не смог использовать, поскольку функция async всегда возвращает Promise<>
.
Я попробовал следующий код:
[AppHttpInterceptor.ts]
constructor(private event: Events, private authService: AuthService,
private refreshTokenService: RefreshTokenService) { }
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
console.log("intercepted request ... ", req.url);
return next.handle(req)
.catch(error => {
if (!error.ok amp;amp; error.error.error === 'invalid_grant') {
console.log('Logout');
this.event.publish('logout');
}
if (req.url != AUTH_ENDPOINT) {
if (error instanceof HttpErrorResponse) {
if (error.status !== 401)
return Observable.throw(error);
return this.authService
.refreshToken()
.then(response => {
console.log('Response: ', response);
console.log('Retrying ... ', req.url);
this.refreshTokenService.publish(''); // Added to each view to make them refresh the data =(.
return next.handle(req);
}).catch((err: any) => {
console.log('Logout');
this.authService.logout();
return Observable.throw(error);
});
}
}
}) as any;
}
[auth.service.ts]
constructor(private http: HttpClient, private storage) { }
public async refreshToken() {
await this.storage.get('userAuth')
.then(userAuth => { this.userAuth = userAuth });
let params = await this.GetAuthRefreshParams(this.userAuth);
let body = await this.encodeParams(params);
return await this.http.post(this.authUrl, body).toPromise()
.then((res: any) => {
if (typeof res.access_token !== 'undefined') {
this.userLogin = this.GetAuthResponse(res);
this.userLogin.RefreshToken = this.userAuth.RefreshToken; // Keeps the old refresh token.
//.
//. Set AuthStorage and GetUserData...
//.
return this.userLogin;
}
}).catch(error => {
console.log(error);
return Observable.throw(error);
});
}
Чего я хочу добиться, так это обновления представления после повторной попытки запроса без добавления наблюдателя на каждой странице;
Повторите запросы даже при отправке добавления / обновления на сервер.
Комментарии:
1. почему вам нужно обновлять представление при обновлении токена?
2. Поскольку в первый раз ответом будет ошибка 401 (неавторизованная), поэтому затем с помощью токена обновления будет сгенерирован новый токен доступа, тогда мне нужно повторить запрос и заставить представление отображать полученные данные.