sud*_*cha 2 python google-app-engine firebase google-cloud-platform google-cloud-firestore
在阅读了每一个问题,在线提供的文档后,我们找不到解决方案,所以在这里发布一个问题。
我们的设置:
项目 FB:仅用于开发模式下的 Firestore。我们希望在托管在不同云项目上的开发后端服务器中访问来自该项目的数据。
Project GCP:一个 GCP 项目,其应用程序部署在 GAE 中,可以对 Project FB 的文档进行简单的 get() 调用。该应用程序使用 Python 编写,并且在 localhost 中可以完美运行,但在部署之后就不行了。
我们正在测试的样例 Flask 代码:
route('/test-fb', methods=['POST', 'GET'])
def test():
doc = doc_ref.get()
if doc.exists:
print(u'Document data: {}'.format(doc.to_dict()))
else:
print(u'No such document!')
return make_response("Firestore worked!")
Run Code Online (Sandbox Code Playgroud)
笔记:
这不是 Firestore 规则的问题,因为我们使用的是服务帐户密钥。为了在任何情况下 100% 确定,我们将规则设置为:始终为真
match /{document=**} { 允许读、写:如果为真
我们通过转到“设置 -> 服务帐户”来生成服务帐户私钥,生成新的私钥。然后在我们的代码上方使用 Python 中的 Admin SDK 配置片段代码。这在本地主机中完美运行。
意识到所需的服务帐户权限,我们为 Project GCP (@appspot.gserviceaccount.com) 的 GAE 服务帐户的 Project FB IAM 帐户添加了许多权限,包括“编辑器”、“存储管理员”和“云数据存储所有者”
所有 Firestore 包,任何其他依赖项都更新到最新版本。
创建新密钥以再次测试。对于 Project FB,更新了凭据 -> 密钥限制并将它们设置为不受限制,以便任何域都可以访问它们。
删除了版本,并在一天中的不同时间重试了很多次。部署通过 Project GCP 中触发的云构建进行。云构建成功。此外,除了我们正在阅读 Firestore 文档(上面的代码)的路由之外,所有路由都运行良好。
删除了 cookie,并尝试了不同的浏览器。
而不是使用片段代码,还尝试了 google-cloud-firestore 包:https : //pypi.org/project/google-cloud-firestore/
两个项目都在同一地点(美国多地点)
请告知我们可能做错了什么,我们还可以尝试什么?我们在这一点上迷路了,这个简单的任务花了我们几天时间,我们已经多次尝试上述步骤的所有排列来仔细检查。
我用一个最小的例子尝试了这个,它奏效了。确保您的 GAE 应用程序使用应用程序默认凭据。
部署 Flask 应用程序project-foo并访问 Firestore 数据库project-bar:
主文件
from flask import Flask
import firebase_admin
from firebase_admin import credentials
from firebase_admin import firestore
app = Flask(__name__)
# Use the application default credentials
cred = credentials.ApplicationDefault()
firebase_admin.initialize_app(cred, {
'projectId': 'project-bar',
})
db = firestore.client()
@app.route('/test-fb', methods=['POST', 'GET'])
def test():
doc = db.collection('users').document('123').get()
if doc.exists:
print(u'Document data: {}'.format(doc.to_dict()))
else:
print(u'No such document!')
return 'Firestore worked!'
if __name__ == '__main__':
Run Code Online (Sandbox Code Playgroud)
部署应用程序 project-foo
gcloud set project project-foo
gcloud app deploy
Run Code Online (Sandbox Code Playgroud)
访问project-foo.uc.r.appspot.com/test-fb。正如预期的那样,请参阅日志中的权限被拒绝错误。
授予project-foo的默认服务帐户访问project-barFirestore 数据库的权限
gcloud set project project-bar
gcloud projects add-iam-policy-binding project-bar \
--member serviceAccount:project-foo@appspot.gserviceaccount.com \
--role roles/datastore.user
Run Code Online (Sandbox Code Playgroud)
等待几分钟让 IAM 绑定生效,刷新project-foo.uc.r.appspot.com/test-fb。见Firestore worked!。
| 归档时间: |
|
| 查看次数: |
529 次 |
| 最近记录: |