Я пробовал 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
Взгляните на этот документ, где он подробно объясняется как использовать Firebase для аутентификации в API Gateway.
В общем, есть два условия, которые нам нужно иметь в виду, чтобы настроить эти службы:
Когда ваше клиентское приложение отправляет HTTP-запрос, заголовок авторизации в запросе должен содержать следующие утверждения JWT:
Для поддержки аутентификации Firebase добавьте следующее в определение безопасности в конфигурации вашего API:
Извините, это не ответ на мой вопрос. Я могу аутентифицировать и запускать функцию или службу. Но ответа я не получаю. — person vzurd; 13.11.2020
Чтобы вызвать
Google Cloud Function
изApi-Gateway
, не делая его общедоступным, вы можете предоставить учетной записи службы, используемойAPI-Gateway
рольCloudFunctions Invoker
На создании конфигурации API (4): вы устанавливаете учетную запись службы , обратите внимание на этот сервисный аккаунт.
После того, как вы определили учетную запись службы, вы можете назначить ей роль
Cloud Funtions Invoker
для учетной записи службы. Для этого вы можете выполнить следующие действия:Cloud Functions Invoker
Это предоставит учетной записи службы разрешение на вызов функций, не делая их общедоступными.
Отвечает на мой дополнительный запрос — person vzurd; 26.11.2020