Динамический хостинг Firebase запрашивает аутентификацию после изменения региона

# #firebase #google-cloud-functions #firebase-hosting

Вопрос:

Я уже некоторое время обслуживаю динамический контент с помощью облачной функции. Теперь я попытался изменить область облачной функции, используя region() в построителе функций:

 // Old
export const serveContent = functions
    .https
    .onRequest((req, res) => {...})

// New
export const serveContent = functions
    .region("europe-west1")
    .https
    .onRequest((req, res) => {...})
 

Во время этого изменения я не изменял свой rewrites в firebase.json .

Теперь запросы больше не доходят до облачной функции (в журналах не отображаются вызовы), и мой браузер перенаправляется с 302 Found кодом состояния на страницу, запрашивающую аутентификацию. Как я могу продолжать предоставлять контент без аутентификации?

введите описание изображения здесь

Редактировать:

Обе облачные функции имеют Cloud Functions-Invoker роль, установленную для allUsers : введите описание изображения здесь

Ответ №1:

Запрос на аутентификацию является лишь побочным эффектом реальной проблемы. В документах указано:

Firebase Hosting поддерживает облачные функции только в США-central1.

Ответ №2:

Каждый раз, когда вы развертываете функцию в новом регионе, облачные функции будут создавать совершенно другую функцию (если не указано иное) вместо изменения предыдущей. Посмотрите здесь, как две функции с одинаковым именем, но в разных регионах работают вместе:

Две облачные функции

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

С другой стороны, у вас, похоже, есть опечатка в вашем коде, но я считаю, что это касается только вашего вопроса, а не вашего кода, поскольку ошибка, о которой вы сообщаете, совершенно иная. Пожалуйста, отредактируйте свой вопрос, если это так.

 // Old
export const serveContent = functions
   .https
   .onRequest((req, res) => {...})

// New
export const serveContent = function // <- Here. It should be 'functions', not function
   .region("europe-west1")
   .https
   .onRequest((req, res) => {...})
 

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

1. Вы были правы насчет опечатки. Я соответствующим образом отредактировал вопрос.

2. Отлично! Вы пытались настроить контроль доступа, как я уже упоминал? Сработало ли это?

3. Я проверил, и для меня уже была Cloud Functions-Invoker добавлена роль allUsers . Если я правильно понимаю, и это то, что вы улучшаете, это, к сожалению, не было проблемой.

4. Возможно ли, что вы пытаетесь получить доступ к предыдущей функции (в предыдущем местоположении)? Проверьте, соответствует ли URL-адрес этой форме: https://europe-west1-[PROJECT-ID].cloudfunctions.net/[FUNCTION-NAME] с правом region , указанным в начале (если вы не используете пользовательский домен для размещения своей функции ).

5. Я использую пользовательский домен, но перенаправление 302, отправляемое firebase hosting, фактически перенаправляет на us-central1 домен. Оказывается, firebase hosting в настоящее время не поддерживает другие регионы.