i18n-backend с авторизацией oauth2 в spartacus - PullRequest
0 голосов
/ 27 мая 2020

Мы хотим использовать backend для i18n в spartacus. К сожалению, этому бэкэнду требуется аутентификация oauth2, но spartacus не отправляет токен-носитель при попытке доступа к этой конечной точке веб-сервиса, и мы получаем ошибку 401. Что мы можем сделать? Прямо сейчас мы пытаемся решить эту проблему следующим образом: то, что нам нужно, реализовано в ClientTokenInterceptor, поэтому мы адаптировали этот перехватчик, немного изменили предложение if, чтобы оно соответствовало URL-адресу серверной части для этих веб-сервисов, и предоставили перехватчик через app.module.ts, который пока работает. К сожалению, вызов this.authService.getClientToken () в нашем перехватчике не возвращает токена.

constructor(
    private authService: AuthService,
    private occEndpoints: OccEndpointsService
  ) {}

  intercept(
    request: HttpRequest<any>,
    next: HttpHandler
  ): Observable<HttpEvent<any>> {
    return this.getClientToken(request).pipe(
      take(1),
      switchMap((token: ClientToken) => {
        if (
          token &&
          request.url.includes("i18n")
        ) {
          request = request.clone({
            setHeaders: {
              Authorization: `${token.token_type} ${token.access_token}`,
            },
          });
        }
        return next.handle(request);
      })
    );
  }

  private getClientToken(request: HttpRequest<any>): Observable<ClientToken> {
    if (
      InterceptorUtil.getInterceptorParam(USE_CLIENT_TOKEN, request.headers)
    ) {
      return this.authService.getClientToken();
    }
    return of(null);
  }

Что мы упускаем?

1 Ответ

0 голосов
/ 04 июня 2020

На самом деле в вашем решении есть пара вещей, которые не нужны.

Я вставил ниже то, что сделал, и проверил, что оно работает правильно (и вы можете видеть данные авторизации в запросах файлов перевода).

Первый выпуск: InterceptorUtil.getInterceptorParam(USE_CLIENT_TOKEN, request.headers) вам не нужно это проверять. Если вам всегда нужны данные аутентификации для запросов на перевод, просто используйте return this.authService.getClientToken();

Вторая проблема: в методе intercept вы не покрывали случаи для любого другого запроса, кроме перевода. Из-за этого здесь будет зависать запрос токена клиента, потому что он будет ждать токена и так далее. Если вы добавите опцию для любого другого случая, кроме i18n, он начнет работать так, как вы предполагали.

Рабочее решение:

@Injectable({ providedIn: 'root' })
export class TranslationsInterceptor implements HttpInterceptor {
  constructor(private authService: AuthService) {}

  intercept(
    request: HttpRequest<any>,
    next: HttpHandler
  ): Observable<HttpEvent<any>> {
    if (request?.url?.includes('i18n')) {
      return this.getClientToken().pipe(
        take(1),
        switchMap((token: ClientToken) => {
          if (token) {
            request = request.clone({
              setHeaders: {
                Authorization: `${token.token_type} ${token.access_token}`,
              },
            });
          }
          return next.handle(request);
        })
      );
    } else {
      return next.handle(request);
    }
  }

  private getClientToken(): Observable<ClientToken> {
    return this.authService.getClientToken();
  }
}
...