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

Youlfey спросил: 28 марта 2018 в 03:09 в: angular

У меня есть метод обновления в 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);
    }

storage-service, которые используют localStorage.

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

1 ответ

Fateh Mohamed ответил: 28 марта 2018 в 03:46

попробуйте это с помощью 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);
        }); 
       } 
    }