Соединитель OpenAPI с обратной связью 4: укажите значение заголовка авторизации для каждого запроса - PullRequest
0 голосов
/ 14 апреля 2020

Я установил соединитель OpenAPI в Loopback 4, как описано здесь , и для неавторизованных запросов он работает хорошо; Мне удалось создать соответствующий источник данных, сервис и контроллер. Мой сервис похож на пример GeocoderProvider , но, скажем, со следующим интерфейсом сервиса.

export interface MyExternalService {
  search_stuff(params: {query?: string}): Promise<MyExternalServiceResponse>;
}

export interface MyExternalServiceResponse {
  text: string;
}

Из моего контроллера я вызываю его так, где this.myExternalService внедренный сервис (вид не связан, но может ли Loopback также неявно анализировать JSON ответ от внешнего источника данных API?):

  @get('/search')
  async searchStuff(@param.query.string('query') query: string): Promise<void> {
    return JSON.parse(
      (await this.myExternalService.search_stuff({query})).text,
    );
  }

Теперь внешней конечной точке, соответствующей myExternalService.search_stuff, требуется Authorization: Bearer <token> заголовок, в котором токен отправляется в Loopback клиентом , т. е. это не API-ключ stati c или около того. Предполагая, что я добавил @param.query.string('token') token: string в список параметров моего метода контроллера searchStuff, как я могу переслать этот токен на соединитель OpenAPI? Это соответствующая часть базового файла определения OpenAMI YAML:

paths:
  /search:
    get:
      security:
        - Authorization: []
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SearchResults'
      operationId: search-stuff
components:
  securitySchemes:
    Authorization:
      type: http
      scheme: Bearer

1 Ответ

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

Я сейчас использую базовую функцию execute коннектора OpenAPI и вручную перехватываю запрос (объект, который передается requestInterceptor, позже передается Swagger напрямую в модуль http):

    return JSON.parse(
      (
        await this.myExternalService.execute(
          'search_stuff',
          {query},
          {
            requestInterceptor: (req: {headers: {Authorization: string}}) => {
              req.headers.Authorization = 'Bearer ' + token;
              return req;
            },
          },
        )
      ).text,
    );

Я также добавил следующий метод к интерфейсу MyExternalService, вдохновленный фактической execute функцией соединителя :

  execute(
    operationId: string,
    parameters: object,
    options: object,
  ): Promise<MyExternalServiceResponse>;

Некоторые вещи, которые я нашел:

  • Loopback внутренне использует модуль swagger-client для выполнения запросов на основе OpenAPI.
  • В частности, опция securities функции исполнения Swagger ожидает Объект определений безопасности . Есть некоторые причуды с фактической передачей его Swagger.
  • Внутренне Swagger создает окончательный HTTP-запрос, отправляемый здесь, в своем исходном коде . Там упоминается ключ securities, но он фактически никогда не используется для запроса. Это означает, что ручное указание его в третьем параметре this.myExternalService.execute ничего не изменит.

Я пока не приму этот ответ, и я с нетерпением жду возможности найти более петлевой подход.

...