在 Heroku 上使用环境变量作为凭证

Using Environment Variables as Credentials on Heroku

我需要使“google-credentials.json”文件在 heroku 上工作它通过将本地路径放在我的笔记本电脑上在本地工作但在 heroku 中我不知道该怎么做.

我搜索了很多,我找到了这个解决方案 How to use Google API credentials json on Heroku? 但我无法让它工作也许解决方案是旧的或者我做错了解决方案是:

1 - Declare your env variables from in Heroku dashboard The GOOGLE_CREDENTIALS variable is the content of service account credential JSON file as is. The GOOGLE_APPLICATION_CREDENTIALS env variable in the string "google-credentials.json"

2 - Once variables are declared, add the builpack from command line :

$ heroku buildpacks:add https://github.com/elishaterada/heroku-google-application-credentials-buildpack

3 - Make a push. Update a tiny thing and push.

这是我的变量和构建包:

这是错误日志:

2022-03-11T09:22:57.866153+00:00 app[worker.1]: Traceback (most recent call last):
2022-03-11T09:22:57.866234+00:00 app[worker.1]:   File "/app/Professor_Bot.py", line 102, in <module>
2022-03-11T09:22:57.866678+00:00 app[worker.1]:     cred_obj = firebase_admin.credentials.Certificate(os.environ['GOOGLE_APPLICATION_CREDENTIALS'])
2022-03-11T09:22:57.866696+00:00 app[worker.1]:   File "/app/.heroku/python/lib/python3.9/site-packages/firebase_admin/credentials.py", line 83, in __init__
2022-03-11T09:22:57.866909+00:00 app[worker.1]:     with open(cert) as json_file:
2022-03-11T09:22:57.866987+00:00 app[worker.1]: FileNotFoundError: [Errno 2] No such file or directory: "'google-credentials.json'"
2022-03-11T09:22:58.491014+00:00 heroku[worker.1]: Process exited with status 1
2022-03-11T09:22:58.644442+00:00 heroku[worker.1]: State changed from up to crashed

这是python代码:

import firebase_admin
from firebase_admin import credentials
from firebase_admin import db
import json
import os


cred_obj = firebase_admin.credentials.Certificate(os.environ['GOOGLE_APPLICATION_CREDENTIALS'])

default_app = firebase_admin.initialize_app(cred_obj, {
    'databaseURL': 'https://professorbot-325702-default-rtdb.firebaseio.com/'})
ref = db.reference("/")
ref.set({
        'boxes':
            {
                'box001': {
                    'color': 'red',
                    'width': 1,
                    'height': 3,
                    'length': 2
                },
                'box002': {
                    'color': 'green',
                    'width': 1,
                    'height': 2,
                    'length': 3
                },
                'box003': {
                    'color': 'yellow',
                    'width': 3,
                    'height': 2,
                    'length': 1
                }
            }
        })

我希望有人能帮助我,非常感谢

无需将整个凭证 json 文件粘贴到配置变量中,您可以将每个键值对手动放入这些配置变量中,然后在您的 python 程序中使用 os.environ.get(key, default) 访问它们.

例如。如果您有如下配置变量:name: abcos.environ.get(name, "Not Available") 将 return abc 如果名称键存在,否则“不可用”。

您可以做的另一件事是,制作 json 文件 public,使用 运行 部分中的 curl 命令将此文件手动下载到您的 Heroku 机器上,然后它将可在本地机器上使用,但我不推荐这种方式。配置变量很好。

感谢上帝,我终于解决了这个问题,而不是使用具有凭据文件名和 json 凭据脚本的环境变量,然后使用 Buildpack 生成本地路径你只需要创建新的 Json 文件 然后在里面写入凭据脚本 最后将新的 Json 文件名作为参数传递给 LoadCredentialsFile 函数 Like This:

firebase_credentials = {
  "type": "",
  "project_id": "",
  "private_key_id": "",
  "private_key": "-----BEGIN PRIVATE KEY-----
-----END PRIVATE KEY-----\n",
      "client_email": "",
      "client_id": "",
      "auth_uri": "",
      "token_uri": "",
      "auth_provider_x509_cert_url": "",
      "client_x509_cert_url": ""
    }
    with open("firebase_credentials.json", "w") as write_file:
        json.dump(firebase_credentials, write_file)
    cred_obj = firebase_admin.credentials.Certificate('firebase_credentials.json')