Шлюз API GCP для облачных функций Проверка подлинности учетной записи службы по умолчанию: «У вашего клиента нет разрешения на запрошенный URL»»

# #google-cloud-functions #google-cloud-iam #google-cloud-api-gateway

Вопрос:

Я пытаюсь использовать шлюз API перед облачными функциями, но получаю ответ 401, когда облачные функции недоступны для общественности.

Я настроил шлюз на использование идентификатора учетной записи службы AppEngine по умолчанию (project-id@appspot.gserviceaccount.com), и присвоил учетной записи службы роль Вызывателя облачных функций в IAM. Я также могу видеть его среди вызывающих на вкладке Разрешения облачных функций. Когда вызывается конечная точка шлюза, я получаю ответ 401 с плохо отформатированной полезной нагрузкой HTML, в котором говорится: «У вашего клиента нет разрешения на запрошенный URL [url]». К сожалению, журналы шлюза также не указывают, в чем проблема. Когда я делаю Облачную функцию общедоступной и жду несколько минут, вызов завершается успешно.

Я несколько раз прочитал раздел руководства «Защита внутренних служб» и не вижу, чего мне не хватает.

ps: Это не проблема JWT, эта часть работает блестяще

Комментарии:

1. Можете ли вы поделиться своим определением безопасности и определением конечной точки в спецификации OpenAPI?

2. Конечно, вот оно

3. Было бы интересно изменить серверную часть и развернуть функции публичного облака, которые просто регистрируют все заголовки запросов. Таким образом, вы сможете поймать токен и расшифровать его, чтобы понять его содержание.

4. Привет @guillaumeblaquiere! Я действительно вижу JWT в этом случае, но моя цель-защитить облачные функции от внешних запросов и сделать шлюз API единственной точкой входа в мое приложение.

5. Хорошо, но вы расшифровали жетон? вы видели, что некоторые значения неверны? Публика? по электронной почте? эмитенты?

Ответ №1:

Нашел корень проблемы: это aud утверждение во внутреннем JWT. Я хотел использовать гибкую адресность облачных функций, например, чтобы вызываемая функция a обрабатывала каждый запрос, с которого начинается a/... . В моем примере функция вызывается hello , и я хочу вызвать ее как /hello/example из шлюза.

Внутренний JWT устанавливает требование аудитории на адрес, указанный в спецификациях OpenAPI ( https://...cloudfunctions.net/hello/example ), который не совсем соответствует базовому URL-адресу Облачной функции (который только https://...cloudfunctions.net/hello ). Поэтому авторизатор облачных функций отклоняет JWT, даже если Аудитория является допустимым URL-адресом, который фактически обслуживается этой функцией.

Очевидное решение состоит в том, чтобы не использовать переменную postfix при вызове облачных функций из шлюза API.