Я пробовал 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
да. Я не использую ключ 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
Я тоже добавил журналы. Я не смог найти ничего из журналов, кроме того факта, что он возвращает 200. Мешает ли шлюз прокси-серверу отправить ответ обратно отправителю? — person vzurd schedule 26.11.2020
@SoniSol, не могли бы вы проверить журналы и сообщить мне, если есть дополнительная информация? — person vzurd schedule 30.11.2020
Источник: