我正在使用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变量,而不是新文件 还有更好的办法吗?
答案 0 :(得分:4)
由于Heroku更新(18 +),MaximeBoué提到的buildpack不再起作用。但是,下面是一个正在运行的类似buildpack。实际上,它是前一个的叉子。
答案 1 :(得分:1)
您可以在应用内使用Heroku Platform API至update 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)
我这样做如下:
创建一个预安装脚本。
"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将找不到该文件。
答案 9 :(得分:-1)
您可以在packge.json中更改这样的脚本, 在GOOGLE_APPLICATION_CREDENTIALS中设置文件json路径
"scripts": {
"start": "GOOGLE_APPLICATION_CREDENTIALS=./yourfile.json node app.js"
}