database - Firebase Cloud Firestore - 通过 REST API 的身份验证错误
问题描述
我正在尝试请求令牌并使用它从 Cloud Firestore 数据库读取/写入数据。
要请求令牌,我通过 Postman 使用以下合成器发送 POST:
https://www.googleapis.com/identitytoolkit/v3/relyingparty/verifyPassword?key={API_KEY}
并将以下内容添加到正文中:
{"email":"{YOUR_EMAIL_ADDRESS}","password":"{PASSWORD}","returnSecureToken":true}
因此,我通过转到 Firebase 控制台 -> 设置 -> 项目配置来获取我的 API_KEY。
然后,我请求令牌的POST如下:(别担心,这里没有敏感数据,他们被修改了)
然后,我收到这个答案:
{
"kind": "identitytoolkit#VerifyPasswordResponse",
"localId": "jGEL4WSI9wRPU11yx9k9ZpAUac73",
"email": "jeferson.pehls@gmail.com",
"displayName": "",
"idToken": "eyJhbGciOiJSUzI1NiIsImtpZCI6IjI1OTc0MmQyNjlhY2IzNWZiNjU3YzBjNGRkMmM3YjcyYWEzMTRiNTAiLCJ0eXAiOiJKV1QifQ.eyJpc3MiOiJodHRwczovL3NlY3VyZXRva2VuLmdvb2dsZS5jb20vZWxldHJvbmljYS1hYjZiMSIsImF1ZCI6ImVsZXRyb25pY2EtYWI2YjEiLCJhdXRoX3RpbWUiOjE1ODA5NTIxOTMsInVzZXJfaWQiOiJqR0VMNFdTSTl3UlBVMTF5eDlrOVpwQVVhYzczIiwic3ViIjoiakdFTDRXU0k5d1JQVTExeXg5azlacEFVYWM3MyIsImlhdCI6MTU4MDk1MjE5MywiZXhwIjoxNTgwOTU1NzkzLCJlbWFpbCI6ImplZmVyc29uLnBlaGxzQGdtYWlsLmNvbSIsImVtYWlsX3ZlcmlmaWVkIjpmYWxzZSwiZmlyZWJhc2UiOnsiaWRlbnRpdGllcyI6eyJlbWFpbCI6WyJqZWZlcnNvbi5wZWhsc0BnbWFpbC5jb20iXX0sInNpZ25faW5fcHJvdmlkZXIiOiJwYXNzd29yZCJ9fQ.H0Mj3J7q_8L9IDAK2-zCZFaN1NP9tG6PKPpmEtjlNcSpT2zxXXPpHN-lxgVhyj_2EDxT1_ZikX2_l4EFBmy2ctYmYOxZF0Pm1UnFaLnXFRMFg7kFxkk6wLZlwI_cFp1TGmYZdgwJBhoude_ItmGlbGFSQGjwyO00DVyHq1nRIh-zl-NUXdMABLE_hbGYlXPYO6VlHLZ-ROXx4n-OnQ2bamNo4l0kp9YRV1z44jYR9ngbkW-eWgu4O7lRSlHgY0rBKF8lnPA__vKEgLyU-hheMwIFVdn7jVJkoKWkWm_-q6MVTCv9YKc0JNDlJm07QGBjss5xBbNWwlPfQ-MBejReoQ",
"registered": true,
"refreshToken": "AEu4IL2RMDFBsoQ5FEsN6rSznT2oElkKSxude28oFWspMHBAzY0J084TbIPfhTtOoKFePO3lnBFpExLraVVE2E2CW2JMSJQ7FFXlrExqULkYdG3n1OxHk8VU01GvBMwJdDTC6i48OOinouYRludjz0tA6xvmaOgfhmm9-NXj3SYU1AIkSXJi5ghYxRuiO4STwg_GpjvRP0Z-NdisYX01wHxmuETHu80VVA",
"expiresIn": "3600"
}
然后,我将尝试使用收到的令牌:
在 Postman 上,我执行 GET https://firestore.googleapis.com/v1/projects/eletronica-ab6b1/databases/(default)/documents/colA/docA.json
,其中 colA 是 COLLECTION 而 docA 是 DOCUMENT。此请求的正文被选为“无”。然后我单击“授权”选项卡,选择类型“承载令牌”并在令牌字段中粘贴上一个请求中收到的令牌字符串。然后点击发送。并收到这个答案:
{
"error": {
"code": 403,
"message": "Missing or insufficient permissions.",
"status": "PERMISSION_DENIED"
}
}
这个错误的原因是什么?可能缺少什么?
会不会是规矩?我目前的规则是这些,我没有随时更改它们,它们是我创建数据库以来的原始值。
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow read, write: if false;
}
}
}
问候。
解决方案
REST api 调用不允许您使用这些规则访问数据库。您应该更改允许读取,写入:允许读取,写入:如果为真;使其可供任何用户使用。
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow read, write: if true; //<--- Here
}
}
}
注意:使读、写为真是一个安全漏洞。你应该使用if request.auth.uid != null; 只让经过身份验证的用户访问数据库(包括像您在此处所做的那样使用令牌)或使用带有 nodejs 后端的 firebase admin 和您当前的安全规则。正如在 firebase 文档中提到的,Firebase Admin SDK 将绕过数据库安全规则。
推荐阅读
- reactjs - Material-ui主题对象中如何将props传递给createTheme()
- java - Java 类
提供但需要类 - reactjs - 获取 componentDidMount 直到页面重新加载后才得到响应
- ruby-on-rails - (NoMethodError) 模型中未定义的私有方法 - Rails
- javascript - 名字姓氏(可选)空格逗号,但如果有 3 个大写字母,则不获取任何内容
- django - POST方法后Django不渲染模板
- ffmpeg - 有没有办法使用ffmpeg检查.mp3是否有元数据?
- python - python 3.x - CoInitialize 没有被多线程调用
- bluetooth-lowenergy - 使用 CircuitPython 将 Adafruit ItsyBitsy (nRF52840) 设置为 BLE Central
- influxdb - 优化查询(最小值、最大值、第一个和最后一个)