Управление потоком при моем входе в систему Невидимый, чтобы получить новый токен с Http-перехватчиком и наблюдаемым

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

Мой перехватчик это:

 intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    let token = localStorage.getItem('TOKEN');
    let clone: HttpRequest<any>;
    if (token) {
      let idUser = JSON.parse(this.jwtHelper.decodeToken(token).id);
      if (idUser == localStorage.getItem('idUser')) {
        if (this.jwtHelper.isTokenExpired(token)) {
          this._up.loginInvisibleEmail().subscribe(res => {
            console.log("Token Refrescado con Email");
          }, error2 => {
            //TODO CATCH ERROR
            console.log("Error obteniendo refrescando token");
          });
        };
        clone = request.clone({
          setHeaders: {
            Accept: `application/json`,
            'Content-Type': `application/json`,
            Authorization: `Bearer ${token}`
          }
        });
      } else {
        console.log("idUser diferentes");
        this._ctp.cleanStorage();
        let nav = this.app.getActiveNav();
        nav.setRoot('Login');
      }
    }else {
      console.log("Without TOKEN");
      clone = request.clone({
        setHeaders: {
          Accept: `application/json`,
          'Content-Type': `application/json`
        }
      });
    }
    console.log("HI INTERCEPTOR");
    return next.handle(clone);
  }

И сервис, который предоставляет мне новый токен:

  loginInvisibleEmail() {
    let postParams = {"email": localStorage.getItem("name"), "password": localStorage.getItem("password")};
    let url = URL_SERVICIOS + "/auth";
    let headers = new Headers();
    headers.append('Content-Type', 'application/json');
    let options = new RequestOptions({headers: headers});
    return this.http2.post(url, JSON.stringify(postParams), options)
      .map(resp => {
        let data_resp = resp.json();
        if (data_resp.error) {
          this._ctp.cleanStorage();
          let nav = this.app.getActiveNav();
          nav.setRoot('Login');
        } else {
          localStorage.removeItem("TOKEN");
          localStorage.setItem('TOKEN', data_resp.result['access_token']);
        }
      }, (error: any) => {
        this._ctp.cleanStorage();
        let nav = this.app.getActiveNav();
        nav.setRoot('Login');
      });
  }

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

deleteEducation(id): Observable<any> {
    let url = URL_SERVICIOS + '/users/educative-experience/' + id;
    // let headers = new HttpHeaders().set('Authorization', 'Bearer ' + localStorage.getItem('TOKEN'));
    return this.http
      .delete(url)
      .map(resp => {
        return resp['result'];
      })
  }

Результат потока:

https://prnt.sc/lhdbxa

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

Как я могу сделать это, чтобы обновить токен в первый раз?

Заранее спасибо.

0 ответов

Другие вопросы по тегам