简单(和)肮脏的Firestore身份验证规则



我正在使用PHP项目中使用REST API,以通过卷曲(PHP卷曲)将数据发送到Firestore DB。

我正在努力理解如何为"服务"设置身份验证规则,而通过Google授权的建议方法对我来说看起来过高。

我的数据只能由我的php服务器可读。

。到目前为止
service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if request.resource.data.auth==123
      //request.auth.uid != null;
    }
  }
}

问题是,当每个人都可以读取数据时,很容易找到此字段(auth),并且知道123是代码。

可能有可能:

  1. 发送标头(或其他未记录到数据库数据)并执行规则检查,而不是数据字段?

  2. 否则(不太喜欢)将仅隐藏" auth"字段?

我知道选项2原则上是不可能的,但是即使我不知道如何进行操作。

我知道这不是最好的方法,但它足以确保我的应用程序。

编辑

可能最简单的解决方案是使用一对电子邮件/密码在Firestore DB中创建用户,并在PHP curl请求

中使用它

我认为我需要在此之后发出卷曲请求:

然后通过另一个PHP卷曲发布数据的上传

我觉得这是正确的道路,但是...。

 404. That’s an error.
The requested URL /identitytoolkit/v3/relyingparty/verifyPassword?key=myapiket was not found on this server. That’s all we know.

我觉得我构成了卷曲的要求...关于如何正确处理有效载荷的任何建议?

解决方案

请参阅下面的步骤和PHP代码

解决方案

好吧,我找到了在使用Firebase Firestore REST API中使用Curl php时实现简单但有效的身份验证的解决方案。

1-创建一个firebase项目

2-在我的情况下,我需要每个人都能读取数据,只有一个用户才能写入数据。因此,在"数据库/规则"中,我认为:

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

3-在"身份验证/登录方法"中启用"电子邮件/密码"作为登录提供商

4-在"身份验证/用户"中,添加用户并提供一对"电子邮件/密码"

5-确定您的项目API密钥,可以在"项目概述/设置/常规/Web API密钥"

中找到

6-发出卷曲请求,以获取通过用户名和密码验证的代币,并使用此令牌来验证Firestore操作。下面的代码:

<?php 
// 1) Retrieve Authorization TOKEN
// https://firebase.google.com/docs/reference/rest/auth/#section-sign-in-email-password
$firestore_key = "MY_KEY";
$url = "https://www.googleapis.com/identitytoolkit/v3/relyingparty/verifyPassword";
$postfields  = array(
        "email" => 'email@domain.com',
        "password" => 'password123456',
        "returnSecureToken" => true
    );
$datapost = json_encode($postfields);
$curl = curl_init();
curl_setopt_array($curl, array(
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_CUSTOMREQUEST => 'POST',
    CURLOPT_HTTPHEADER => array('Content-Type: application/json'),
    CURLOPT_URL => $url . '?key='.$firestore_key,
    CURLOPT_USERAGENT => 'cURL',
    CURLOPT_POSTFIELDS => $datapost
));

$response = curl_exec( $curl );
curl_close( $curl );
$responsJson=json_decode($response,true);
// 2) Add data
//https://medium.com/@aliuwahab/firestore-firebase-php-saving-data-to-a-firestore-database-using-php-curl-2921da3b0ed4
$ID=10000001;
$firestore_data  = [
        "status" => ["integerValue" => 1500]
    ];
$data = ["fields" => (object)$firestore_data];
//    Possible *value options are:
//    stringValue
//    doubleValue
//    integerValue
//    booleanValue
//    arrayValue
//    bytesValue
//    geoPointValue
//    mapValue
//    nullValue
//    referenceValue
//    timestampValue
$json = json_encode($data);
#Provide your firestore project ID Here
$project_id = "myspecific_project"; //found in "Database/Data"
#Provide your firestore documents group
$documents_group = "my_group";
// https://stackoverflow.com/questions/50866734/rest-api-firestore-authentication-with-id-token/50866783#50866783
$url = "https://firestore.googleapis.com/v1beta1/projects/$project_id/databases/(default)/documents/$documents_group/$ID/";
$curl = curl_init();
curl_setopt_array($curl, array(
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_CUSTOMREQUEST => 'POST',
    CURLOPT_HTTPHEADER => array('Content-Type: application/json',
        'Content-Length: ' . strlen($json),
        'X-HTTP-Method-Override: PATCH',
        'Authorization: Bearer '.$responsJson['idToken']        
        ),
    CURLOPT_URL => $url . '?key='.$firestore_key ,
    CURLOPT_USERAGENT => 'cURL',
    CURLOPT_POSTFIELDS => $json
));

$response = curl_exec( $curl );
curl_close( $curl );
// Show result
echo $response . "n";
?>

注意:在代码中,我标记了链接到帮助我使用工作解决方案的信息

不可能通过您的请求发送自定义标题。或更准确:这些标题将在您的安全规则中可用。请参阅Firebase Firestore中,是否有任何方法可以将信息传递给不属于路径的安全规则?,在Google Firestore规则中访问cookie,以及如何让特定的API在Firestore上运行/读取请求?。

也无法通过安全规则隐藏文档的单个字段。用户可以完全访问文档,或者完全无法访问。请参阅Firestore:使用安全规则限制儿童/现场访问并在Firestore中确保特定的文档字段。

您唯一真正的选择是验证您的PHP脚本并将令牌传递到呼叫中,然后验证它是您的服务器进行更改。

最新更新