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

问题描述 投票:0回答:2

我在PHP项目中使用REST API通过curl(PHP curl)将数据发送到Firestore DB。

我正在努力了解如何为“服务”设置身份验证规则,而通过Google授权建议的方法对我来说过于苛刻。

我的数据必须是ALL可读的,但只能由我的PHP服务器写入。

到目前为止,我可以确保只有在发送了特定代码的数据集中才能发生写入操作(auth = 123):

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数据库中创建用户,并在PHP curl请求中使用它

我想我需要在此之后发出一个卷曲请求:

https://firebase.google.com/docs/reference/rest/auth/#section-sign-in-email-password

然后使用第一个请求中收到的令牌作为auth,通过另一个PHP curl发布数据上传

我觉得这是正确的道路但......我在第一次请求时遇到困难

 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代码

rest curl firebase-authentication google-cloud-firestore firebase-security-rules
2个回答
0
投票

无法根据您的请求发送自定义标头。或者更准确地说:这些标头在您的安全规则中不可用。见In Firebase Firestore, is there any way to pass info to the Security Rules which is not part of the path?Accessing Cookies in Google Firestore RuleHow to let specific API to run write/read requests on firestore?

也不可能通过安全规则隐藏文档的单个字段。文档对于用户来说是完全可访问的,或者它是完全不可访问的。见Firestore: restricting child/field access with security rulesSecuring specific Document fields in Firestore

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


0
投票

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

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-发出curl请求以获取通过用户名和密码验证的tokenId,并使用此令牌验证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 protected]',
        "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";

?>

注意:在代码中,我标记了指向帮助我推出可行解决方案的信息的链接

© www.soinside.com 2019 - 2024. All rights reserved.