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

时间:2017-11-23 02:01:16

标签: python heroku google-api

我正在使用Google Calendar 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变量,而不是新文件 还有更好的办法吗?

10 个答案:

答案 0 :(得分:4)

由于Heroku更新(18 +),MaximeBoué提到的buildpack不再起作用。但是,下面是一个正在运行的类似buildpack。实际上,它是前一个的叉子。

答案 1 :(得分:1)

您可以在应用内使用Heroku Platform APIupdate Heroku env vars

答案 2 :(得分:1)

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

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

GOOGLE_CREDENTIALS变量是服务帐户凭据JSON文件的内容。 字符串“ google-credentials.json”中的GOOGLE_APPLICATION_CREDENTIALS环境变量

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

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

3-进行推送。更新一个小东西然后推送。

4-构建包将自动生成google-credentials.json并用google凭据内容填充。

如果您在某件事上失败了,它将无法正常工作。使用Heroku bash检查google-credentials.json的内容。

答案 3 :(得分:1)

有关此主题的更多官方 Heroku文档https://elements.heroku.com/buildpacks/buyersight/heroku-google-application-credentials-buildpack

我还使用了 buyersight buildpack,它是唯一对我有用的

答案 4 :(得分:1)

如果仍然有人在寻找它,我已经通过将JSON直接存储在env变量(没有额外的构建包)中,设法将其用于Google Cloud Storage。

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

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

from google.cloud import storage
from google.oauth2 import service_account

# the json credentials stored as env variable
json_str = os.environ.get('GOOGLE_APPLICATION_CREDENTIALS')
# project name
gcp_project = os.environ.get('GCP_PROJECT') 

# generate json - if there are errors here remove newlines in .env
json_data = json.loads(json_str)
# the private_key needs to replace \n parsed as string literal with escaped newlines
json_data['private_key'] = json_data['private_key'].replace('\\n', '\n')

# use service_account to generate credentials object
credentials = service_account.Credentials.from_service_account_info(
    json_data)

# pass credentials AND project name to new client object (did not work wihout project name)
storage_client = storage.Client(
    project=gcp_project, credentials=credentials)

希望这会有所帮助!

编辑:阐明这是针对Google Cloud Storage的。对于其他服务,这些类将有所不同,但是从other docs的外观来看,不同的Google客户端类应允许传递凭据对象。

答案 5 :(得分:0)

似乎可以在其中上载凭据.json文件的那些buildpacks无法正常工作。我最终使用Lepinsk的buildpack(https://github.com/lepinsk/heroku-google-cloud-buildpack.git)进行管理,该buildpack要求将所有键和值都设置为Heroku中的config vars。它确实可以完成工作,所以非常感谢!

答案 6 :(得分:0)

我这样做如下:

  • 创建两个环境变量
    1. 凭据-Google API凭据的base64编码值
    2. CONFIG_FILE_PATH-/app/.gcp/key.json(我们将在运行时创建此文件。在heroku预安装阶段如下所示)

创建一个预安装脚本。

"heroku-prebuild": "bash preinstall.sh",

然后在preinstall.sh文件中,对CREDENTIALS进行解码并创建一个配置文件,并在那里进行更新。

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

答案 7 :(得分:0)

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

设置配置变量:

heroku config:set GOOGLE_APPLICATION_CREDENTIALS=gcp_key.json
heroku config:set GOOGLE_CREDENTIALS=<CONTENTS OF YOU GCP KEY>

在Heroku仪表板上更容易设置GOOGLE_CREDENTIALS。

使用一行创建.profile来写入json文件:

echo ${GOOGLE_CREDENTIALS} > /app/gcp_key.json

很显然,将更改提交到.profile并推送到heroku。


推荐的buildpack不再起作用,在任何情况下,它都变得更加直接而无需费劲。

答案 8 :(得分:0)

如上所述,官方 Heroku文档有效(https://elements.heroku.com/buildpacks/buyersight/heroku-google-application-credentials-buildpack)。

但是对于PHP Laravel用户,应将配置变量GOOGLE_APPLICATION_CREDENTIALS设置为../google-credentials.json。否则,PHP将找不到该文件。

Screenshot from Heroku

答案 9 :(得分:-1)

您可以在packge.json中更改这样的脚本, 在GOOGLE_APPLICATION_CREDENTIALS中设置文件json路径

"scripts": {
    "start": "GOOGLE_APPLICATION_CREDENTIALS=./yourfile.json node app.js"
  }