Angular 7 - Как создать перехватчик http, который должен обновить токен jwt, прежде чем добавить его в запрос? - PullRequest
0 голосов
/ 12 июня 2019

У меня есть простой перехватчик, используемый для добавления токена jwt к каждому запросу (кроме запроса, используемого для обновления токена).Чтобы восстановить токен, мне нужно вызвать метод "getSession", который возвращает сеанс в обратном вызове и который отвечает за обновление токена, когда это необходимо.

Когда токен jwt все еще действует, все работает нормально: токен извлекается и добавляется в запрос, но когда токен необходимо обновить методом getSession, у меня возникает ошибка, и запрос не отправляется.

  intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    if (req.url.includes('cognito-idp')) {
      // Request token request does not need a token
      return next.handle(req);
    } else {
      console.log('get session');
      return this.cognitoUtil.getCurrentUser().getSession((err, session) => {
        console.log('in get session callback');
        if (err) {
          console.log('Problem to get the session:' + err);
          this.logoutUser();
          return Observable.throw(err);
        } else {
          console.log('We have the session...');
          if (session.isValid()) {
            console.log('...and session is valid');
            const token = session.getIdToken().getJwtToken();
            const requestWithToken = req.clone({
              setHeaders: {
                'Content-Type': 'application/json',
                'Authorization': token
              }
            });
            console.log('return the session with the token: ' + token);
            return next.handle(requestWithToken);
          } else {
            console.log('... but session is not valid');
            this.logoutUser();
            return Observable.throw(err);
          }
        }
      });
    }
  }

Журналы, когда токен по-прежнемуvalid:

get session
in get session callback
We have the session...
...and session is valid
return the session with the token: eyJraW...

Журналы, когда токен обновляется методом getSession:

get session
core.js:15724 ERROR Error: Uncaught (in promise): TypeError: You provided 'undefined' where a stream was expected. You can provide an Observable, Promise, Array, or Iterable.
TypeError: You provided 'undefined' where a stream was expected. You can provide an Observable, Promise, Array, or Iterable.
    at subscribeTo (subscribeTo.js:28)
    at subscribeToResult (subscribeToResult.js:15)
    at MergeMapSubscriber.push../node_modules/rxjs/_esm5/internal/operators/mergeMap.js.MergeMapSubscriber._innerSub (mergeMap.js:74)
(...)
in get session callback
We have the session...
...and session is valid
return the session with the token: eyJra...

У вас есть какие-либо идеи по этому поводу?У меня складывается впечатление, что перехват не ждет возврата нового токена методом getSession

...