аутентификация в asyn c setContext - PullRequest
0 голосов
/ 12 апреля 2020

В документах (https://www.apollographql.com/docs/angular/recipes/authentication/) есть пример. Однако это не сработает, если у вас есть angular -apollo watch (). ValueChanges или fetch () с повторной обработкой Observable ...

Мой код:

const auth = setContext(async (_, {headers}) => {
      let token = authService.getAccessToken();

      if (!authService.hasValidAccessToken()) {
        if (authService.hasRefreshToken()) {

          await this.authService.refreshToken().pipe(first()).toPromise(); //Does not work...

          token = authService.getAccessToken();
        }
      }
      // Return the headers as usual
      return {
        headers: {
          Authorization: `Bearer ${token}`,
        },
      };
    });

Метод authService.refreshToken () возвращает следующее:

refreshToken(): Observable<any> {
    this.removeAccessToken();
    if (this.hasRefreshToken()) {
      return this.refreshGQL.fetch({
         refreshToken: this.getRefreshToken()
      }).pipe(
        tap(next => {
            this.storeTokens(next.data.refresh);
          }
        )
      );
}

Проблема в том, что нельзя вызвать метод подписки, который запустит Observable. У вас есть решение?

1 Ответ

0 голосов
/ 17 апреля 2020

хорошо, это не имело ничего общего с ожиданием обещания и наблюдаемым обещанием. Это совершенно верно.

Это был просто тупик classi c.

Если нет действительного токена доступа, он попытается получить новый, в результате чего запрос gql, который также не имеет действительного токена доступа, который будет пытаться получить новый для каждого запроса gql и т. д. c ...

Решается простым пропуском логики c, если имя операции равно refre sh мутация или запрос.

...