Внезапная ошибка (403-Запрещено) при вызовах Firestore

#firebase #google-cloud-firestore #firebase-app-check

#firebase #google-облако-firestore #firebase-app-проверка

Вопрос:

У меня есть этот простой код с использованием Firestore-PHP

 <?php

require 'vendor/autoload.php';
use GoogleCloudFirestoreFirestoreClient;

putenv('GOOGLE_APPLICATION_CREDENTIALS='.realpath("key.json"));

$db = new FirestoreClient();

$docRef = $db->collection('orders')->document('1562292363537');
$snapshot = $docRef->snapshot();

?>
 

Все мои PHP-вызовы Firestore начали внезапно получать эту ошибку: (403: запрещено)

 Uncaught GoogleCloudCoreExceptionServiceException: {
    "message": "403:Forbidden",
    "code": 14,
    "status": "UNAVAILABLE",
    "details": [
        {
            "@type": "content-length",
            "data": "0"
        },
        {
            "@type": "date",
            "data": "Sun, 12 Dec 2021 00:00:36 GMT"
        },
        {
            "@type": "alt-svc",
            "data": "h3=":443"; ma=2592000,h3-29=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43""
        }
    ]
 

У меня возникла эта проблема с двумя разными проектами, и я использую последнюю версию Google-Cloud-SDK.

Я попытался создать новый ключ учетной записи службы с полными разрешениями, но это бесполезно.


Эта ошибка возникла в то же время, когда проверка приложения начала показывать этот график:

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

Хотя проверка приложения не выполняется в настройках

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

Есть ли способ исправить эту проблему, пожалуйста?

Ответ №1:

Просто предположение, поскольку я не видел его раньше, но я подозреваю, что «Unenforced» в статусе RTDB и Cloud Firestore вызваны слабыми или отсутствующими правилами.

Убедитесь, что у вас установлены правила и что они не оставляют вашу базу данных «широко открытой» с точки зрения безопасности.

Например, если у вас есть Allow read, write: true , то ваша база данных «широко открыта». По крайней мере, вы хотите обеспечить проверку подлинности пользователей с помощью чего-то вроде: Allow read, write: if request.auth.uid != null

(Примечание: вы все равно можете разрешить анонимным пользователям доступ к вашему приложению, включив анонимную аутентификацию, если Firebase Auth. Анонимные пользователи Firebase Auth по-прежнему используют «аутентифицированные» запросы)

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

1. Я хочу сохранить проверку приложения (без принудительной проверки).. Я могу активировать ее, но это мне не поможет .. также редактирование правил не устранило проблему

Ответ №2:

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

Вот несколько рекомендаций, которые могут быть полезны для вас:

  • Если почти все последние запросы поступают от проверенных клиентов, рассмотрите возможность включения принудительного применения, чтобы начать защиту ваших внутренних ресурсов.
  • Если значительная часть недавних запросов поступает от клиентов, которые, вероятно, устарели, чтобы не мешать пользователям, подумайте о том, чтобы подождать, пока другие пользователи обновят ваше приложение, прежде чем включать принудительное выполнение. Принудительная проверка приложения в выпущенном приложении приведет к разрыву предыдущих версий приложения, которые не интегрированы с SDK App Check.
  • Если ваше приложение еще не запущено, вам следует немедленно включить принудительную проверку приложений, поскольку устаревшие клиенты не используются.

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

1. Но проверка приложения еще недоступна для PHP !?

2. Какую версию PHP вы используете? Я пробовал использовать export GOOGLE_APPLICATION_CREDENTIALS="path/to/your/keyfile.json" терминал, и у меня все работало нормально. Что касается проверки приложения, оно все еще находится в стадии бета-тестирования, поэтому пока поддерживаются не все языки.

Ответ №3:

Я только что столкнулся с этой проблемой. Это было связано с использованием устаревшего пакета firebase-admin. По-видимому, без предупреждения Google устарел v8 и ниже. Вам нужно будет обновить ваш пакет до последней версии.

npm i firebase-admin@latest