skip to Main Content

I want to use Google’s Firestore to save user data, while the backend uses PHP. So far I configured the access rules like this:

rules_version = '2';

service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if request.auth != null;
    }
  }
}

I followed google’s official documentation and my code looks like this:

$firestore = new FirestoreClient([
  'projectId' => env('firebase.project.id'),
  'keyfileName' => env('firebase.key.file')
]);

$collection = $firestore->collection('users');
$document = $collection->document($uid);

//this one triggers the permission error
$secret_key = $document->snaphot->get('secret_key');

Then I get:

PERMISSION_DENIED: Missing or insufficient permissions.

I tried to modify my rules like this:

rules_version = '2';

service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if request.auth.uid != null;
    }
  }
}

No difference. By the way, the firebase authentication part works, I can create users and make them logged in. Furthermore, if I turn of the rules the error vanishes, but obviosly that is not a solution. I’m using CodeIgniter 4.5.5 with the most recent google/cloud-firestore. When I will be back in my office, I can link all the dependencies. For now, I would appreciate any help.

2

Answers


  1. Chosen as BEST ANSWER

    Finally here is the solution.

    I used kreait/firebase-php implementation of firestore. However make sure you fulfill all requirements listed in google's doc to make it work.

    Dependencies in composer.json:

    "firebase/php-jwt": "^6.10",
    "google/cloud-firestore": "^1.47",
    "google/gax": "1.35.1",
    "google/protobuf": "^4.29",
    "grpc/grpc": "^1.57",
    "kreait/firebase-php": "^7.0"
    

    Firestore:

    use GoogleCloudFirestoreDocumentSnapshot;
    use GoogleCloudFirestoreFirestoreClient;
    use KreaitFirebaseContractAuth;
    use KreaitFirebaseFactory;
    
    ...
     
        public function __construct()
        {
            $this->factory =  (new Factory())
                ->withServiceAccount(env('firebase.key.file'))
                ->withFirestoreDatabase('(default)');
     
            $this->auth = $this->factory->createAuth();
    
            //this one gives the FirestoreClient
            $this->firestore = $this->factory->createFirestore()->database();
        }
    
       ...
     
        public function getUserData(string $uid) : DocumentSnapshot
        {
            $collection = $this->firestore->collection('users');
            $user = $collection->document($uid);
            return $user->snapshot();
        }
    
        public function saveUserData(string $uid, array $data) : void
        {
            $collection = $this->firestore->collection('users');
            $user = $collection->document($uid);
            $user->set($data);
        }
    

  2. I don’t know if the typo is in your actual code, but I’m pretty sure that it should be $secret_key = $document->snapshot->get('secret_key');, not $document->snaphot.

    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search