lip*_*sum 6 python google-api heroku
我正在使用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变量,而不是新文件。
有什么更好的办法吗?
Chr*_*jan 13
推荐的构建包不再起作用。这是一种快速、直接的方法来执行相同的操作:
heroku config:set GOOGLE_APPLICATION_CREDENTIALS=gcp_key.json
heroku config:set GOOGLE_CREDENTIALS=<CONTENTS OF YOU GCP KEY>
GOOGLE_CREDENTIALS 在 Heroku 仪表板中更容易设置。
.profile文件,其中包含一行以写入 json 文件:echo ${GOOGLE_CREDENTIALS} > /gcp_key.json
.profile每次容器启动时都会运行。
.profile并推送到 Heroku,这将触发重建并创建该gcp_key.json文件。Tom*_*Tom 12
如果有人仍在寻找这个,我刚刚通过将 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 客户端类应该允许传递凭据对象。
sam*_*sam 10
由于 Heroku 更新(18+),Maxime Boué 提到的 buildpack 不再工作。但是,下面是一个类似的构建包,它正在运行。它实际上是前一个的一个分叉。
小智 7
我花了一整天的时间来找到解决方案,因为它很棘手。无论您使用哪种语言,解决方案都是一样的。
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-buildpack将自动生成google-credentials.json并用google凭据内容填充。
如果您在某件事上失败了,它将无法正常工作。使用Heroku bash检查google-credentials.json的内容。
| 归档时间: | 
 | 
| 查看次数: | 1295 次 | 
| 最近记录: |