# #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.