你好stackoverflow社区,
我正在使用Firestore而不是实时数据库进行测试项目。
newproject-30f72
,已经创建的集合名称是testcollection
电子邮件/密码
身份验证方法,并已注册新的电子邮件id/密码
用户。我的授权写入规则如下
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow read, write: if request.auth.uid != null;
}
}
}
在这一点上,我不确定,仅在报头中传递一个更简单的令牌就足以验证请求。auth。uid!=null
,因此很可能我的规则也可能是错误的,因为我正在使用模拟器自动生成规则,但我通过完全禁用规则来验证该规则没有导致我目前面临的问题。
规则
,因此只有经过身份验证的用户才能向firestore写入。(所谓身份验证,我指的是基于特定电子邮件/密码的用户的idToken
,而不是web应用程序的apiKey
。我不知道这是否可行。)
var firebaseConfig = {
apiKey: "some_api_key",
authDomain: "newproject-30f72.firebaseapp.com",
databaseURL: "https://newproject-30f72.firebaseio.com",
projectId: "newproject-30f72",
storageBucket: "newproject-30f72.appspot.com",
messagingSenderId: "111122223333",
appId: "1:1111:web:2222"
};
我正在使用上述json对象中的
apiKey
来获取一个idToken
有效一段时间,以写入firestore数据库。python3中的代码如下所示。
import json
from urllib import request, error
from collections import defaultdict
firebase_apikey = 'some_api_key'
auth_request_url = "https://www.googleapis.com/identitytoolkit/v3/relyingparty/verifyPassword?key={}".format(firebase_apikey)
class auth:
def __init__(self, email: str, password: str):
self.email = email
self.password = password
self.post_data = defaultdict()
self.post_data['email'] = self.email
self.post_data['password'] = self.password
self.post_data['returnSecureToken'] = True
self.headers = {"Content-Type": "application/json"}
# print("POST DATA IS:: " + json.dumps(self.post_data))
self.r = request.Request(auth_request_url,
data=json.dumps(self.post_data).encode(),
headers=self.headers)
# self.url_open
def get_auth_token(self):
try:
self.url_open = request.urlopen(self.r)
except Exception as e:
return e
try:
return json.loads(self.url_open.read())
except Exception as e:
return e
s = auth("someuser.somethingelse@gmail.com", "somepassword")
response = s.get_auth_token()
id_token = response['idToken']
expires_in = response['expiresIn']
我得到了idToken,它是一个924个字符长的字符串。
现在,我正试图使用我收到的
idToken
写入firestore,并使用Authorization':“Bearer
标头,有效期为3600秒,如下所示。
firestore_project_url = "https://firestore.googleapis.com/v1beta1/projects/{}/databases/(default)/documents:write".format(
'newproject-30f72')
headers = {
'Content-type': 'application/json',
'Authorization': 'Bearer %s' % id_token,
}
test_data = '''
{
"writes": [{
"updateMask": {
"fieldPaths": ["name"]
},
"update": {
"name": "projects/newproject-30f72/databases/(default)/documents/testcollection/testdoc/",
"fields": {
"name": {
"stringValue": "test"
}
}
}
}]
}
'''
test_data_json_bytes = json.dumps(test_data).encode("utf-8")
req = request.Request(url=firestore_project_url,
data=test_data_json_bytes,
headers=headers,
method='POST')
print(headers)
f = request.urlopen(req)
我可以看到标题为
{'Content-type': 'application/json', 'Authorization': 'Bearer eyJhbGciOiJSUzI1NiIsI........<snip>'}
但是我得到了一个
urllib。错误HTTPError:HTTP错误400:错误请求
错误。
我参考了Firebase Firestore REST示例,使用带有自定义头的curl来检查它,以添加承载令牌,并查看是否存在任何可能的详细信息,现在我看到了
* Trying 74.125.68.95...
* TCP_NODELAY set
* Connected to firestore.googleapis.com (74.125.68.95) port 443 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
* successfully set certificate verify locations:
* CAfile: /etc/ssl/certs/ca-certificates.crt
CApath: none
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
* TLSv1.3 (IN), TLS handshake, Server hello (2):
* TLSv1.3 (IN), TLS handshake, Encrypted Extensions (8):
* TLSv1.3 (IN), TLS handshake, Certificate (11):
* TLSv1.3 (IN), TLS handshake, CERT verify (15):
* TLSv1.3 (IN), TLS handshake, Finished (20):
* TLSv1.3 (OUT), TLS change cipher, Change cipher spec (1):
* TLSv1.3 (OUT), TLS handshake, Finished (20):
* SSL connection using TLSv1.3 / TLS_AES_256_GCM_SHA384
* ALPN, server accepted to use h2
* Server certificate:
* subject: C=US; ST=California; L=Mountain View; O=Google LLC; CN=*.googleapis.com
* start date: May 14 13:35:00 2019 GMT
* expire date: Aug 6 13:20:00 2019 GMT
* subjectAltName: host "firestore.googleapis.com" matched cert's "*.googleapis.com"
* issuer: C=US; O=Google Trust Services; CN=Google Internet Authority G3
* SSL certificate verify ok.
* Using HTTP2, server supports multi-use
* Connection state changed (HTTP/2 confirmed)
* Copying HTTP/2 data in stream buffer to connection buffer after upgrade: len=0
* Using Stream ID: 1 (easy handle 0x560e5884af30)
> POST /v1beta1/projects/newproject-30f72/databases/(default)/documents/testcollection3 HTTP/2
> Host: firestore.googleapis.com
> User-Agent: curl/7.64.1
> Accept: */*
> {Content-type: application/json, Authorization: Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6........<snip>}
> Content-Type: application/json
> Content-Length: 258
>
* We are completely uploaded and fine
* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
* old SSL session ID is stale, removing
* Connection state changed (MAX_CONCURRENT_STREAMS == 100)!
< HTTP/2 400
< content-type: text/html; charset=UTF-8
< referrer-policy: no-referrer
< content-length: 1555
< date: Fri, 31 May 2019 14:31:36 GMT
<
* HTTP/2 stream 0 was not closed cleanly: PROTOCOL_ERROR (err 1)
* stopped the pause stream!
* Connection #0 to host firestore.googleapis.com left intact
curl: (92) HTTP/2 stream 0 was not closed cleanly: PROTOCOL_ERROR (err 1)
* Closing connection 0
我参考了以下链接作为参考。
https://groups.google.com/forum/#!主题/google-oud-fireport-讨论/4Le2RskC3cghttps://firebase.google.com/docs/firestore/reference/rest/v1beta1/projects.databases.documents/commit
我想要达到的是
使用电子邮件/密码身份验证来验证到文件夹
- 创建集合并向其写入文档。
非常感谢您的帮助。
这就是我的工作原理(我使用了请求
模块,但净效果是一样的)
首先是身份验证,就像你做的一样。
url = "https://www.googleapis.com/identitytoolkit/v3/relyingparty/verifyPassword?key=" + API_KEY
payload = {"email": email, "password": password, "returnSecureToken": True}
rsp = requests.post(url, data=payload)
id_token = rsp.json().get("idToken")
# User idToken from your auth for later requests
headers = {
'Content-type': 'application/json',
'Authorization': "Bearer %s" % id_token
}
现在在集合中创建一个文档
# Create a doc in "testcoll"
url = "https://firestore.googleapis.com/v1beta1/projects/" + PROJECT + "/databases/(default)/documents/testcoll"
payload = {
"fields": {
"meaningOfLife": {"integerValue": 42}
}
}
# Create Doc
rsp = requests.post(url, headers=headers, data = json.dumps(payload))
assert(rsp.status_code == 200)
docref = rsp.json().get("name")
print(rsp.json())
现在更新同一文档
# Update doc
url = "https://firestore.googleapis.com/v1beta1/" + docref
payload = {
"fields": {
"meaningOfLife": {"stringValue": '43'}
}
}
rsp = requests.patch(url, headers=headers, data = json.dumps(payload))
assert(rsp.status_code == 200)
print(rsp.json())
本文向大家介绍dart 创建一个新的集合,包括了dart 创建一个新的集合的使用技巧和注意事项,需要的朋友参考一下 示例 可以通过构造函数创建集合:
我建立了一个具有两个节点和外部Zookeper集合的SOLR集群。该ZK集合有3个节点。我使用参数启动solr实例: 这意味着,我希望SOLR配置在/solr5下,而不是默认情况下的/下。 文件夹 /solr5在ZK中创建: 我还可以毫无问题地将SOLR配置上传到/solr5中。 我的问题是,在创建集合时,如何将生成的文件置于/solr5之下? 我用来创建集合的命令是: 我查看了本页上的文档,但没
在我的应用程序中,用户可以选择一个目录,在其中使用隐含的意图action_open_document_tree创建Excel文件。但是,中返回的Uri不能由使用。它抛出: 在中,我通过检查路径是否存在,如果不存在,我要创建一个新的Excel文件。 onActivityResult(): createNewExcelFile():
我需要创建一个fiRecovery文档,它也有一个集合,理想情况下是在单个写入操作中。 我在文档中没有看到类似的内容,因此,如果失败了,那么关于获取创建的文档id然后将多个文档添加到集合中有什么提示吗? 编辑:我正在用typescript/js开发
这种差异让我很困惑: 为什么?
本文向大家介绍sass 创建和使用混合,包括了sass 创建和使用混合的使用技巧和注意事项,需要的朋友参考一下 示例 要创建一个mixin,请使用@mixin指令。 您可以在mixin名称后面的括号内指定参数列表。切记以变量开头,$并用逗号分隔。 要在另一个选择器中使用mixin,请使用@include指令。 从混入样式将目前在使用footer,并header与值#ccc的$color变量,#dd
MongoDB 中的集合是一组文档的组合,类似于关系型数据库(例如 MySQL)中的数据表。集合存在于数据库中,且没有固定的结构,您可以向集合中插入不同格式或类型的数据。 在 MongoDB 中,您可以使用 createCollection() 方法来创建集合,语法格式如下: db.createCollection(name, options) 参数说明如下: name: 要创建的集合名称; op
问题内容: 我正在尝试使用JNI函数创建Java类,并使用DeviceId.java构造函数方法设置该类的某些属性。我可以使用GetMethodID获取构造函数方法,但是如何创建Device.java的新实例,然后设置属性(setId和setCache)。目标是将完全填充的Device.java对象的实例返回给调用者。有任何想法吗? JNI功能: Java类: 问题答案: 调用时,您为two-ar