Python 如何在Heroku上使用Google API凭据json?

Python 如何在Heroku上使用Google API凭据json?,python,heroku,google-api,Python,Heroku,Google Api,我正在使用谷歌日历API制作一个应用程序,并计划在Heroku上构建它。 我对身份验证有问题。通常我使用凭证json文件,但出于安全原因,这次我不想将其上传到Heroku上。 我怎样才能对Heroku进行授权 现在,我将json放在一个env变量中,并使用oauth2client的from_json方法 def get_credentials(): credentials_json = os.environ['GOOGLE_APPLICATION_CREDENTIALS'] cr

我正在使用谷歌日历API制作一个应用程序,并计划在Heroku上构建它。
我对身份验证有问题。通常我使用凭证json文件,但出于安全原因,这次我不想将其上传到Heroku上。
我怎样才能对Heroku进行授权

现在,我将json放在一个env变量中,并使用
oauth2client
from_json
方法

def get_credentials():
    credentials_json = os.environ['GOOGLE_APPLICATION_CREDENTIALS']
    credentials = GoogleCredentials.from_json(credentials_json)
    if not credentials or credentials.invalid:
        flow = client.flow_from_clientsecrets(CLIENT_SECRET_FILE, SCOPES)
        flow.user_agent = APPLICATION_NAME
        if flags:
            credentials = tools.run_flow(flow, store, flags)
        else: # Needed only for compatibility with Python 2.6
            credentials = tools.run(flow, store)
        print('Storing credentials to ' + credential_path)
    return credentials 
但是这个代码并不完美。如果凭据无效,我希望代码将新凭据写入env变量,而不是新文件。

有没有更好的方法?

你可以在你的应用程序中使用to。

我花了一整天的时间来寻找解决方案,因为这很棘手。 无论您使用何种语言,解决方案都是相同的

1-从Heroku仪表板中声明环境变量,如:

GOOGLE_CREDENTIALS变量是服务帐户凭据JSON文件的内容。 字符串“GOOGLE CREDENTIALS.json”中的GOOGLE_APPLICATION_CREDENTIALS env变量

2-声明变量后,从命令行添加别克:

$ heroku buildpacks:add https://github.com/elishaterada/heroku-google-application-credentials-buildpack
3-推一下。更新一个小东西并推送

4-buildpack将自动生成一个google-credentials.json,并用google凭证内容的内容填充它


如果你在某件事上失败了,那就行不通了。使用Heroku bash检查google-credentials.json的内容。

可以上载credentials.json文件的构建包似乎没有按预期工作。我最终使用了Lepinsk的buildpack(),它要求在Heroku中将所有键和值设置为配置变量。不过,它确实起到了作用,所以非常感谢

您可以在packge.json中更改这样的脚本, 在GOOGLE_应用程序_凭据中设置文件json路径

"scripts": {
    "start": "GOOGLE_APPLICATION_CREDENTIALS=./yourfile.json node app.js"
  }
本主题中更为正式的Heroku文档:


我还使用了buyersight的
构建包
,这是唯一一个对我有效的构建包

Maxime Boué提到的构建包由于Heroku更新(18+)而不再有效。然而,下面是一个正在工作的类似构建包。它实际上是前一个叉子的叉子

  • 在Heroku应用程序设置的buildpack设置中使用以下链接
  • 在Config Vars GOOGLE_中定义凭据为密钥,将凭据文件的内容定义为值
  • 在Config Vars中将GOOGLE_应用程序_凭据定义为键,将GOOGLE-CREDENTIALS.json定义为值
  • 重新部署应用程序,它应该可以工作
如果有人还在寻找这个,我刚刚通过将JSON直接存储在一个env变量中(无需额外的构建包),成功地将其用于Google云存储

您需要将json凭据数据放入您的环境变量中并安装

然后,解析json并将google凭据传递给存储客户端:

从google.cloud导入存储
从google.oauth2导入服务_帐户
#存储为env变量的json凭据
json\u str=os.environ.get('GOOGLE\u应用程序\u凭据')
#项目名称
gcp_项目=os.environ.get('gcp_项目')
#生成json-如果此处有错误,请删除.env中的换行符
json_data=json.loads(json_str)
#私钥需要用转义换行符替换\n解析为字符串文字的私钥
json_数据['private_key']=json_数据['private_key']。替换('\\n','\n')
#使用服务\u帐户生成凭据对象
凭据=服务\帐户。凭据。来自\服务\帐户\信息(
json(数据)
#将凭据和项目名称传递给新的客户端对象(在没有项目名称的情况下无法工作)
storage\u client=storage.client(
项目=gcp_项目,凭证=凭证)
希望这有帮助


编辑:澄清这是针对谷歌云存储的。对于其他服务,这些类将有所不同,但是从不同的Google客户端类的外观来看,它们应该允许传递凭据对象。

我已经这样做了,如下所示:

  • 创建了两个环境变量
  • 凭据-google api凭据的base64编码值
  • 配置文件路径-/app/.gcp/key.json(我们将在运行时创建此文件。在heroku预安装阶段,如下所示)
创建预安装脚本

"heroku-prebuild": "bash preinstall.sh",
在preinstall.sh文件中,解码凭据并创建一个配置文件并在其中更新

if [ "$CREDENTIALS" != "" ]; then


echo "Detected credentials. Adding credentials" >&1
  echo "" >&1

  # Ensure we have an gcp folder
  if [ ! -d ./.gcp ]; then
    mkdir -p ./.gcp
    chmod 700 ./.gcp
  fi

  # Load the private key into a file.
  echo $GCP_CREDENTIALS | base64 --decode > ./.gcp/key.json

  # Change the permissions on the file to
  # be read-only for this user.
  chmod 400 ./.gcp/key.json
fi

您可以通过向repo添加
.profile
文件来创建JSON密钥文件,该文件将在Heroku启动容器时执行

设置配置变量:

heroku config:set GOOGLE_APPLICATION_CREDENTIALS=gcp_key.json
heroku config:set GOOGLE_CREDENTIALS=<CONTENTS OF YOU GCP KEY>
显然,将更改提交到
.profile
并推送到heroku


推荐的buildpack不再有效,而且在任何情况下,这感觉更直接而不费力。

如上所述,Heroku官方文档有效()

但是,对于PHPLaravel用户,配置变量
GOOGLE\u APPLICATION\u CREDENTIALS
应设置为
。/GOOGLE CREDENTIALS.json
。否则,PHP将找不到该文件


仅供参考,此buildpack当前不起作用,您可能必须使用该buildpack的“gerywahyunugraha”提供的fork。目录无法创建或找到,知道原因吗?我尝试了此答案,但收到错误消息,有人能帮我吗?:错误:您必须为Google云存储指定凭据密钥文件才能工作。它不再工作。我得到了以下错误:JSONDecodeError(“期望值:第2行第1列(char 1)”),正如在项目的git回购中提到的,Heroku 18+以后,本回购协议无法开箱即用
https://github.com/gerywahyunugraha/heroku-google-application-credentials-buildpack 
使用这个fork可以解决一些错误,但这意味着如果版本控制需要包含凭证的yourfile.json,并且包含凭证数据在版本控制很糟糕,所以你只需复制粘贴整个j
echo ${GOOGLE_CREDENTIALS} > /app/gcp_key.json