【问题标题】:Firestore PHP SDK using Auth Rule setup使用身份验证规则设置的 Firestore PHP SDK
【发布时间】:2020-07-17 05:44:30
【问题描述】:

我是 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" } }

我可以想办法获取用户数据,例如:电子邮件和密码或用户 ID 令牌,如何使用用户数据解决上述错误?

【问题讨论】:

标签: google-cloud-firestore firebase-authentication firebase-security


【解决方案1】:

我刚刚找到它,也许对任何人都有用。

存档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,我检查了会话,在标头上添加了 Bearer 令牌。在上面的使用示例之后,我在使用 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');

在auth rule中我也可以根据用户的email名字制定文档规则,用户的email可以通过之前添加的token id获取。示例:

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /users/{email} {
       allow read, write: if email == request.auth.token.email;
    }
  }
}

【讨论】:

    猜你喜欢
    • 2018-04-04
    • 2019-10-17
    • 2019-06-02
    • 2018-03-30
    • 2019-07-15
    • 1970-01-01
    • 2021-04-08
    • 2021-07-23
    相关资源
    最近更新 更多