Не удается получить доступ к документам Firestore из PHP-скриптов с ключом API

#php #google-cloud-firestore

# #php #google-облако-firestore

Вопрос:

Я новичок в Firebase / Firestore. Я создал 2 проекта, которые обращаются к одним и тем же данным в Firestore. Один находится в Android, а другой — в веб-приложении на php. Я могу получить доступ к данным в приложении для Android, но в приложении PHP мне пришлось создать ключ API на странице учетных данных. Сначала я хочу использовать Firestore на пробной основе, но не могу получить доступ к документам. Выдает ошибку

Неустранимая ошибка: неперехваченное исключение RuntimeException: средство выборки учетных данных не реализует интерфейс Google AuthUpdateMetadataInterface в C:xampphtdocsFirestoreProjectvendorgoogleauthsrcFetchAuthTokenCache.php:190 Трассировка стека: #0 C:xampphtdocsFirestoreProjectvendorgooglegaxsrcCredentialsWrapper.php (197): GoogleAuthFetchAuthTokenCache->updateMetadata(массив, ‘https://firesto …’) #1 [внутренняя функция]: Google ApiCore CredentialsWrapper-> Google ApiCore{закрытие}(Объект(стандартный класс)) #2 C:xampphtdocsFirestoreProjectvendorgrpcgrpcsrclibServerStreamingCall.php (44): GrpcCall-> startBatch(массив) #3 C:xampphtdocsFirestoreProjectvendorgrpcgrpcsrclibBaseStub.php (364): Grpc ServerStreamingCall->пуск(объект(Google Cloud Firestore V1 BatchGetDocumentsRequest), Массив, Массив) #4 C:xampphtdocsFirestoreProjectvendorgrpcgrpcsrclibBaseStub.php(589): GrpcBaseStub->Grpc{закрытие}(‘/google.firesto …’, объект (Google Cloud Firestore V1 BatchGetDocumentsRequest), Массив, Массив, массив) #5 C:xampphtdocsFirestoreProjectve в C:xampphtdocsFirestoreProjectvendorgoogleauthsrcFetchAuthTokenCache.php в строке 190

Я установил composer и обновил зависимости и gRPC.

Мой index.php чтение файла

 <?php
    session_start();
    require_once 'vendor/autoload.php';
    require_once "Firestore.php";
    
    
    $apiKey = 'WWWWWWWWWWWWWWWWWWWWWW';
    
    
    $url ='https://console.firebase.google.com/project/prject-ID/firestore? 
    key=Aasdads';
    $fs = new Firestore('Users');
    print_r($fs->getDocument('9427349073'));
    
    return;
?>
 

Мой Firestore.php чтение файла

 <?php

    use GoogleCloudCoreExceptionGoogleException;
    use GoogleCloudFirestoreFirestoreClient;
    
    class Firestore
    {
    
        protected $db;
        protected $name;   // $name is name of collection
    
        public function __construct(string $collection) // $collection = 
                                                        //  'Users'
        {
            if (isset($this)) {
    
                try {
                    $this->db = new FirestoreClient([
                    'projectId' => 'XXXXXXXXXXXXXXXXXXX'
                    ]);
     
                    $this->name = $collection;
    
                } catch (GoogleException $e) {
                    print_r($e->getMessage());
                }
    
            }else{
    
    
            }


    }


    public function getDocument(string $name)  // $name is name of document 
    {
        return  $this->db->collection($this->name)->document($name)- 
        >snapshot()->data();

    }

}


?>
 

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

Пожалуйста, помогите

с уважением

Санджиш

Я сделал test.php файл после создания учетной записи службы и указания на ключ.файл json в командной строке с использованием набора GOOGLE_APPLICATION_CREDENTIALS

 <?php

    require_once 'vendor/autoload.php';
    
    session_start();
    
    use GoogleCloudFirestoreFirestoreClient;
  
     initialize();
    
    
    function initialize()
    {
        // Create the Cloud Firestore client
    
        $db = new FirestoreClient([
            'projectId' => 'Valbhai-xxx'
        ]);
    
      
        $usersRef = $db->collection('Users'); // This works
        $snapshot = $usersRef->documents();   // This does not work , gives 
                                              // the same error
    
        foreach ($snapshot as $user) {
    
            printf('User: %s' . PHP_EOL, $user->client_name());
        }
    
    }

?>
 

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

1. Привет, вы определили свои учетные данные, как указано в быстром запуске PHP firestore, PHP — это серверное программное обеспечение, и для использования Firestore необходимо использовать учетные данные учетной записи службы

2. Я последовал твоему совету , Ян , и создал учетную запись сервиса . Это сработало. Большое спасибо

3. Частично это сработало . $usersRef = $db-> коллекция (‘Пользователи’); -> Это работает, но $doc = $usersRef-> documents(); выдает ту же ошибку

4. Можете ли вы обновить код в своем вопросе, чтобы понять, что работает, а что нет?

Ответ №1:

Я воспроизвел вашу проблему на своем компьютере и заметил, что это связано с тем, что PHP игнорирует переменную среды GOOGLE_APPLICATION_CREDENTIALS , поскольку она не определена для пользовательского Apache (или httpd). чтобы исправить это, я изменил инициализацию, используя этот блок кода

 
$db = new FirestoreClient([
            'keyFilePath' => '/path/to/credentials.json',
            'projectId' => 'my-project-id'
        ]);

 

С keyFilePath помощью (этот параметр задокументирован здесь ) библиотека Firestore будет искать учетные данные GCP, используя строку пути вместо переменной среды

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

1. FirestoreClient() принимает только 1 параметр, а не 2

2. @SANJISHKUMAR вы уверены? у вас была возможность протестировать его? keyFilePath задокументировано в исходном коде