API-шлюз не возвращает ответ

Я пробовал GCP API Gateway с использованием аутентификации firebase. Я вижу, что мой запрос был обработан из журналов и завершен с кодом ответа 200. Однако я не получаю ответ своему клиенту. Я получаю ответ, когда вызываю функцию напрямую. Я что-то упускаю ?

Конфигурация API

swagger: "2.0"
info:
  title: API Endpoints
  description: API Endpoints
  version: 1.0.1
schemes:
  - https
produces:
  - application/json
securityDefinitions:
  firebase:
    authorizationUrl: ""
    flow: "implicit"
    type: "oauth2"
    x-google-issuer: "https://securetoken.google.com/my-project"
    x-google-jwks_uri: "https://www.googleapis.com/service_accounts/v1/metadata/x509/[email protected]"
    x-google-audiences: "my-project"
paths:
  /hello:
    get:
      summary: Test link
      operationId: hello
      x-google-backend:
        address: https://us-central1-my-project.cloudfunctions.net/hello
      security:
        - firebase: []
      responses:
        "200":
          description: A successful response
          schema:
            type: string
        "403":
          description: Failed to authenticate

Функция

 * Responds to any HTTP request.
 *
 * @param {!express:Request} req HTTP request context.
 * @param {!express:Response} res HTTP response context.
 */
exports.helloWorld = (req, res) => {
  let message = req.query.message || req.body.message || 'Hello World!';
  res.status(200).send(message);
};

Журналы

Журналы

Дополнительный запрос Изначально у меня были частные функции, и я получал 403. Это дало мне 200, когда я добавил allUsers с Cloud Functions Invoker к разрешениям для функции, которую я пытаюсь вызвать. Так что я здесь немного запутался. Отчасти я использую шлюз API с firebase auth, чтобы защитить его от несанкционированных вызовов. И чтобы firebase auth работал, мне пришлось добавить allUsers, сделав его общедоступным. Насколько я понимаю, только шлюз API будет общедоступным, в то время как все вызываемые им серверные службы будут частными. В этом случае функция может быть вызвана напрямую кем угодно, что сделает API Gateway бесполезным. Как я могу настроить бэкэнд как частный и отвечать только на аутентифицированные вызовы через шлюз API?

Дополнительные журналы

{
 insertId: "[email protected]"  
 jsonPayload: {
  api_key_state: "NOT CHECKED"   
  api_method: "1.myapi.GenerateRTCToken"   
  api_name: "1.myapi"   
  api_version: "1.0.1"   
  client_ip: "999.999.999.999"   
  http_method: "GET"   
  http_response_code: 200   
  location: "us-central1"   
  log_message: "1.myapi.GenerateRTCToken is called"   
  producer_project_id: "myproject"   
  request_latency_in_ms: 161   
  request_size_in_bytes: 4020   
  response_size_in_bytes: 579   
  service_agent: "ESPv2/2.17.0"   
  service_config_id: "myapi-config"   
  timestamp: 1606313914.9804168   
  url: "/generateRTCToken"   
 }
 logName: "projects/myproject/logs/myapi%2Fendpoints_log"  
 receiveTimestamp: "2020-11-25T14:18:36.521292489Z"  
 resource: {
  labels: {
   location: "us-central1"    
   method: "1.myapi.GenerateRTCToken"    
   project_id: "myproject"    
   service: "myapi"    
   version: "1.0.1"    
  }
  type: "api"   
 }
 severity: "INFO"  
 timestamp: "2020-11-25T14:18:34.980416865Z"  
}

вы пробовали следовать официальной документации? cloud.google.com/api-gateway/docs/quickstart-console   —  person vzurd    schedule 05.11.2020

См. также:  Как собрать / скомпилировать облачные функции firebase с помощью webpack

да. Я не использую ключ API, как указано в документации. Вместо этого я использую firebase auth. Он действительно не говорит мне, почему я не получил ответа, и не отвечает на мой второй вопрос.   —  person vzurd    schedule 05.11.2020

Что вы имеете в виду, когда не получаете ответа? Он висит? На сколько долго? Возможная ошибка?   —  person vzurd    schedule 18.11.2020

Да, он ждет ответа и в конце концов истекает время ожидания.   —  person vzurd    schedule 20.11.2020

Я считаю, что это, возможно, две смешанные проблемы: одна — вообще не получает ответа, а другая — может быть связана с разрешениями внутри проекта (вот почему вам нужно было сделать функции общедоступными). Развернуты ли функции из проекта GCP или из проекта firebase?   —  person vzurd    schedule 24.11.2020

о том, что не получил ответа вообще, 1) не могли бы вы поделиться журналами api-gateway? 2) при прямом вызове облачной функции вы получаете какой-либо ответ?   —  person vzurd    schedule 25.11.2020

1. 2020-11-25 00:53:59.184 EST us-central1 200 1.2 s 1.quadlii_api_1vss1kcaz7bkf_apigateway_fan_demand_cloud_goog.GenerateRTCToken is called Журнал из шлюза API предполагает, что ответ был возвращен. Код ответа: 200 2. Да Функция является общедоступной. Я все еще hasnet придумал, как сделать его приватным и по-прежнему вызывать его для аутентифицированных пользователей. См. Мой Additional Query в вопросе   —  person vzurd    schedule 25.11.2020

Я опубликовал ответ о функциях, которые должны быть общедоступными. Если вам нужна дополнительная помощь с функциями, у которых нет ответа, вы можете опубликовать новый вопрос или поделиться полными журналами, чтобы у нас было больше отладочной информации, чтобы помочь вам.   —  person vzurd    schedule 26.11.2020

См. также:  Composer (Airflow) DAG RunID конфликт в GCP

Я тоже добавил журналы. Я не смог найти ничего из журналов, кроме того факта, что он возвращает 200. Мешает ли шлюз прокси-серверу отправить ответ обратно отправителю?   —  person vzurd    schedule 26.11.2020

@SoniSol, не могли бы вы проверить журналы и сообщить мне, если есть дополнительная информация?   —  person vzurd    schedule 30.11.2020

Понравилась статья? Поделиться с друзьями:
IT Шеф
Комментарии: 2
  1. vzurd

    Взгляните на этот документ, где он подробно объясняется как использовать Firebase для аутентификации в API Gateway.

    В общем, есть два условия, которые нам нужно иметь в виду, чтобы настроить эти службы:

    Когда ваше клиентское приложение отправляет HTTP-запрос, заголовок авторизации в запросе должен содержать следующие утверждения JWT:

    • iss (эмитент)
    • sub (тема)
    • aud (аудитория)
    • iat (выдан в)
    • exp (время истечения)

    Для поддержки аутентификации Firebase добавьте следующее в определение безопасности в конфигурации вашего API:

    securityDefinitions:
        firebase:
          authorizationUrl: ""
          flow: "implicit"
          type: "oauth2"
          # Replace YOUR-PROJECT-ID with your project ID
          x-google-issuer: "https://securetoken.google.com/YOUR-PROJECT-ID"
          x-google-jwks_uri: "https://www.googleapis.com/service_accounts/v1/metadata/x509/[email protected]"
          x-google-audiences: "YOUR-PROJECT-ID"
    

    Извините, это не ответ на мой вопрос. Я могу аутентифицировать и запускать функцию или службу. Но ответа я не получаю. person vzurd; 13.11.2020

  2. vzurd

    Чтобы вызвать Google Cloud Function из Api-Gateway, не делая его общедоступным, вы можете предоставить учетной записи службы, используемой API-Gateway роль CloudFunctions Invoker

    На создании конфигурации API (4): вы устанавливаете учетную запись службы , обратите внимание на этот сервисный аккаунт.

    После того, как вы определили учетную запись службы, вы можете назначить ей роль Cloud Funtions Invoker для учетной записи службы. Для этого вы можете выполнить следующие действия:

    • Перейдите в IAM & Admin.
    • Найдите учетную запись службы и нажмите на карандаш рядом с ней (если вы не видите учетную запись службы, нажмите «Добавить» и введите адрес электронной почты учетной записи службы)
    • Для роли Выберите Cloud Functions Invoker
    • Нажмите на Сохранить

    Это предоставит учетной записи службы разрешение на вызов функций, не делая их общедоступными.

    Отвечает на мой дополнительный запрос person vzurd; 26.11.2020

Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: