Firestore PHP SDK с использованием настройки Auth Rule - PullRequest
1 голос
/ 05 апреля 2020

Я новичок в Firebase, сейчас я хочу попробовать Firestore php SDK и реализовать правило авторизации firestore. Текущий код ниже работает нормально

use Google\Cloud\Firestore\FirestoreClient;

 $db = new FirestoreClient();
 $db->collection('mycollectionname')
    ->document('mydocumentname')
    ->set(['name'=>'aaa','value'=>'111');

Правило аутентификации Firestore

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {

      // before change
      allow read, write: if true;

      // after change
      allow read, write: if request.auth.uid != null;

    }
  }
}

После изменения true на request.auth.uid! = Null , это дает мне ошибку:

{ "error": { "code": 403, "message": "Missing or insufficient permissions.", "status": "PERMISSION_DENIED" } }

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

1 Ответ

0 голосов
/ 08 апреля 2020

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

в файле use Google\Cloud\Firestore\Connection\Grpc Я внес некоторые изменения:

......
......

    private function addRequestHeaders(array $args)
    {
        $args += [
            'headers' => []
        ];

        $args['headers']['google-cloud-resource-prefix'] = [$this->resourcePrefixHeader];


        /////////  CODE THAT I ADD ///////////
        if(session('user_token'))
        {
            $args['headers']['Authorization'] = ['Bearer '.session('user_token')];
        }
        /////////  CODE THAT I ADD ///////////

        // Provide authentication header for requests when emulator is enabled.
        if ($this->isUsingEmulator) {
            $args['headers']['Authorization'] = ['Bearer owner'];
        }

        return $args;
    }

Используя laravel, я сделал это, чтобы проверить сессию , чтобы добавить токен на заголовок. После этого, используя приведенный выше пример, я добавил сеанс до того, как была использована функция Firestore

use Google\Cloud\Firestore\FirestoreClient;

 /// adding session
 session(['user_token'=>'eyJhbGciOiJSUzI1................']);

 $db = new FirestoreClient();
 $db->collection('users')
    ->document('test@gmail.com')
    ->set(['name'=>'aaa','value'=>'111');

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

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /users/{email} {
       allow read, write: if email == request.auth.token.email;
    }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...