Обновить токен с помощью асинхронного метода subscribe

108
10

У меня есть метод обновления в AuthService:

refresh() {
const body = new HttpParams()
.set('grant_type', 'refresh_token')
.set('refresh_token', this.storage.getRefreshToken());
let headers = new HttpHeaders();
headers = headers.append("Authorization", "Basic " + btoa("my-client:secret"));
headers = headers.append("Content-Type", "application/x-www-form-urlencoded");
return this.http.post('http://localhost:8090/oauth/token', body.toString(), {
headers: headers});
}

Я хочу, чтобы access_token обновлялся при переходе на страницы приложения. И я добавил INTERCEPTOR к моей заявке:

intercept(req: HttpRequest<any>, next: HttpHandler) {
if (req.url.includes('/users')) {
this.auth.refresh().subscribe(
(data:any) => {this.storage.setToken(data.access_token,
data.refresh_token); });
req = req.clone(
{
setHeaders: {
Authorization: 'bearer ${this.storage.getAccessToken()}'
}
}
);
}
return next.handle(req);
}

хранилище - служба, в которой используется localStorage.

Я не знаю, как обрабатывать ответ с сервера. Я понимаю, что метод async подписывается, но я не понимаю, что мне нужно сделать, чтобы сделать эту работу.

спросил(а) 2018-04-21T19:49:00+03:00 2 года, 2 месяца назад
1
Решение
100

попробуйте это с помощью flatMap

 intercept(req: HttpRequest<any>, next: HttpHandler) {
if (req.url.includes('/users')) {
return this.auth.refresh().flatMap((data:any) => {
this.storage.setToken(data.access_token,data.refresh_token);
newReq = req.clone(
{
setHeaders: {
Authorization: 'bearer ${this.storage.getAccessToken()}'
}
}
);
return next.handle(newReq);
});
}
}

ответил(а) 2018-04-21T20:26:00+03:00 2 года, 2 месяца назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема