Угловое обновление токена-перехватчика - PullRequest
0 голосов
/ 15 февраля 2019

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

Вот моя функция перехвата:

public intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
console.log('===== Intercept =====');
console.log(req);
return next.handle(req).pipe(
  catchError((err: any) => {
    console.log(err);

    this.refreshToken().subscribe( resolve => {
      console.log('RESOLVE');
      // clone the original request
      if (resolve) {

        console.log('REQ REPEAT');

        let headers = new HttpHeaders({
          'Content-Type': 'application/json'
        });
        if (this.appState.token !== null) {
          headers = headers.set('Authorization', 'Bearer ' + this.appState.token);
        }

        const authReqRepeat = req.clone(
          {headers: headers}
        );


        console.log('NEW TOKEN : Bearer ' + this.appState.token);
        console.log(authReqRepeat);
        // resend the request
        return next.handle(authReqRepeat);
      } else {
        return next.handle(req);
      }
    }, error => {
      console.log('ERROR');
      return throwError(error);
    });
  }),
);
}

Функция refreshToken возвращает мне истинноеили ложный ответ (true, если обновление в порядке).

Итак, моя первая проблема связана с заголовками запроса клона, я пробовал несколько вариантов их размещения, но в конце все еще нет заголовка в моем клонированном запросе (есть оригинальный заголовок запроса, если я не пытаюсь добавить новый).

Следующая проблема также касается запроса, когда дело доходит до next.handle с моим новым запросом не отправляется (У меня нет журнала об этом запросе), и в мое приложение ничего не возвращается, поэтому мой компонент ждет ответа, который никогда не придет.

И третья проблема связана с catchError, у меня есть этоошибка в (err : any)

TS2345: Argument of type '(err: any) => void' is not assignable to parameter of type '(err: any, caught: Observable<HttpEvent<any>>) => ObservableInput<{}>'.   Type 'void' is not assignable to type 'ObservableInput<{}>'.

Я не очень доволен наблюдаемым, но если я добавлю return throwError(error); после моего вызова к refreshToken, ошибка исчезнет, ​​но у меня бесконечный цикл.

1 Ответ

0 голосов
/ 15 февраля 2019

первый вопрос, попробуйте использовать это вместо набора append:

const headers = new HttpHeaders({
                'Content-Type': 'application/json',
                'Authorization': 'Bearer ' + this.appState.token
              });

второй вопрос, потому что вы используете только next.handle (authReqRepeat).и нет подписчика, так что он не может работать, вы можете попробовать это:

http.request(authReqRepeat).subscribe(()=>{})

последний вопрос, используя ошибку внутри наблюдаемой трубы 'tap':

next.handle(req).pipe(
        tap((res) => return of(res),(error) => {doSomething(error); return of(error)})
      );

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

if (this.reqList.indexOf(req)){ return handle.next(req)} and then ...
...