我正在使用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是代码。
可能有可能:
发送标头(或其他未记录到数据库数据)并执行规则检查,而不是数据字段?
否则(不太喜欢)将仅隐藏" 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脚本并将令牌传递到呼叫中,然后验证它是您的服务器进行更改。