Кондиционирование перехватчика - PullRequest
0 голосов
/ 12 апреля 2020

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

export class InterceptorService implements HttpInterceptor {
  constructor(private auth: AuthService) {}

  intercept(
    req: HttpRequest<any>,
    next: HttpHandler
  ): Observable<HttpEvent<any>> {
    this.auth.isAuthenticated$.subscribe((data) =>
      console.log("boolean", data)
    );
    return this.auth.getTokenSilently$().pipe(
      mergeMap((token) => {
        const tokenReq = req.clone({
          setHeaders: { Authorization: `Bearer ${token}` },
        });
        return next.handle(tokenReq);
      }),
      catchError((err) => throwError(err))
    );
  }
}

getTokenSilently$(options?): Observable<string> {
    return this.auth0Client$.pipe(
      concatMap((client: Auth0Client) => from(client.getTokenSilently(options)))
    );
  }

Ответы [ 2 ]

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

Мне кажется довольно дорогим, что вы получаете токен при каждом запросе. Почему вы не храните его в сеансе / локальном хранилище или готовите ie или какой-либо подобный механизм?

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

Это немного больше, но я считаю, что это может помочь в вашем случае использования.

Кроме того, у вас есть преимущество: вы делаете на 1 запрос меньше за каждый запрос, который вы делаете. То, что вы делаете сейчас для каждого запроса, вам нужно сделать еще один, чтобы получить токен.

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

Попробуйте это:

intercept(
    req: HttpRequest<any>,
    next: HttpHandler
  ): Observable<HttpEvent<any>> {
    return this.auth.isAuthenticated$.pipe(
      mergeMap((authenticated: boolean) => {
        if (authenticated) {
          return this.auth.getTokenSilently$().pipe(
            mergeMap((token) => {
              const tokenReq = req.clone({
                setHeaders: { Authorization: `Bearer ${token}` },
              });
              return next.handle(tokenReq);
            })
          );
        } else {
          return next.handle(req);
        }
      })
    )
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...