Python 如何在cloud composer环境中获得合适的凭据以调用google sheets API?

Python 如何在cloud composer环境中获得合适的凭据以调用google sheets API?,python,google-oauth,airflow,google-authentication,google-cloud-composer,Python,Google Oauth,Airflow,Google Authentication,Google Cloud Composer,我希望在通过CloudComposer运行python代码时能够访问google工作表上的数据;当在本地运行代码时,我知道如何通过多种方式做到这一点,但事实证明,向云端迁移很有挑战性。特别是,我希望作为composer服务帐户进行身份验证,而不是将client_secret.json文件的内容隐藏在某个地方(可能是源代码或某个云位置) 对于本质上相同的问题,但不是访问谷歌云平台服务,这是相对容易的(即使在通过composer运行时),这要归功于。例如,我已经验证了我可以将数据推送到bigquer

我希望在通过CloudComposer运行python代码时能够访问google工作表上的数据;当在本地运行代码时,我知道如何通过多种方式做到这一点,但事实证明,向云端迁移很有挑战性。特别是,我希望作为composer服务帐户进行身份验证,而不是将client_secret.json文件的内容隐藏在某个地方(可能是源代码或某个云位置)

对于本质上相同的问题,但不是访问谷歌云平台服务,这是相对容易的(即使在通过composer运行时),这要归功于。例如,我已经验证了我可以将数据推送到bigquery:

from google.cloud import bigquery
client = bigquery.Client()

client.project='test project'
dataset_id = 'test dataset'
table_id = 'test table'

dataset_ref = client.dataset(dataset_id)
table_ref = dataset_ref.table(table_id)
table = client.get_table(table_ref)

rows_to_insert = [{'some_column':'test string'}]
errors = client.insert_rows(table,rows_to_insert)
可以通过与composer服务帐户共享(或不共享)“测试数据集”来管理此操作的成功或失败

类似地,从云存储桶获取数据也可以:

from google.cloud import storage
client = storage.Client()
bucket = client.get_bucket('test bucket')
name = 'test.txt'
data_blob = bucket.get_blob(name)
data_pre = data_blob.download_as_string()
我再次有能力通过IAM控制访问

然而,为了使用GoogleSheets,我似乎必须求助于GoogleAPI python客户端,在这里我遇到了困难。关于这一点的大多数文档(这似乎是一个移动的目标!)都假设本地代码执行,从创建和存储client_secret.json文件开始,我在本地理解该文件,但对于具有源代码控制的共享云环境来说没有意义。因此,我尝试了几种方法:

尝试使用发现和oauth2构建凭据

from googleapiclient.discovery import build
from httplib2 import Http
from oauth2client.contrib import gce

SAMPLE_SPREADSHEET_ID = 'key for test sheet'
SAMPLE_RANGE_NAME = 'test range'

creds = gce.AppAssertionCredentials(scope='https://www.googleapis.com/auth/spreadsheets')
service = build('sheets', 'v4', http = creds.authorize(Http()))

sheet = service.spreadsheets()
result = sheet.values().get(spreadsheetId=SAMPLE_SPREADSHEET_ID,
                            range=SAMPLE_RANGE_NAME).execute()
values = result.get('values', [])
警告:我不知道如何使用作用域通过Http创建凭据对象。但这似乎是最有效的:我得到了一个HTTP403错误

'请求的身份验证作用域不足。'

然而,我不知道这是否意味着我成功地展示了自己的服务帐户,这被认为是不适合访问的(因此我需要更多的权限);或者说实际上没有做到这一点(并且需要修复这个凭证创建过程)

使用google.auth获取凭证对象并传递到gspread

我(有限的)理解是oauth2client正在开发中,而google.auth现在是下一步。这以一种类似于我上面成功的云平台服务示例的简单方式生成凭证对象,我希望我可以将其传递给gspread:

import gspread
from google.auth import compute_engine

credentials = compute_engine.Credentials()
client = gspread.authorize(credentials)
遗憾的是,gspread不能处理这些对象,因为它们没有它所期望的属性:

AttributeError:“凭据”对象没有“访问令牌”属性

这大概是因为gspread期望oauth2凭据与google.auth丢弃的凭据不完全兼容。也会出现“只需获取客户的机密文件”。。。但是,如果我可以使用前面的(基于oauth/http的)方法,那么我就可以使用gspread进行数据检索。不过,就目前而言,这两种方法的混合体遇到了同样的问题:由于身份验证作用域不足而导致权限拒绝响应


因此,无论是使用google.auth、oauth2(假设这会持续一段时间)还是其他云友好方法(即不是基于存储密钥的方法),我如何在cloud composer环境中获得合适的凭据来调用google sheets API?与gspread(因此也与gspread_数据帧)兼容的方式有额外的标记,但这不是必需的。也很高兴听到这是一个PEBCAK错误,我只需要为我当前的工作方法配置不同的IAM权限

您的Composer环境配置似乎未正确设置。如果未指定,默认云平台不允许您访问GoogleSheetsAPI。您可能希望创建一个oauthScopes=[ "", ""].


Google sheets API参考:

尝试获取必要的访问令牌,然后使用原始HTTP REST电子表格API,这样您就不会处于不推荐使用的库地狱中。这仍然需要在源中嵌入凭据,这可能会导致任何有权访问它的人的权限升级。(然而,通过我想采取的路线,我可以限制谁拥有相关项目的编写者权限,而另一个项目中的相同代码将显示为不同的服务帐户,而该服务帐户将不具有对工作表的权限。)不要求在源代码中硬编码凭据。它们可以存储在一个安全的数据库中。我的例子只嵌入了简单性的信条来说明这个概念。太好了,这让我达到了我需要的位置(而且我永远不会查看环境配置)。为了其他人的利益,格式是相当繁琐的;尽管这些文档使用的是上面的列表格式,似乎是通过json配置的。在cloud shell上,它是--oauth作用域“”,即没有方括号。@GrayTaylor,那么在添加此oauth作用域后,您最终使用google.auth模块?@DanielLavedoniodeLima在设置了作用域后,“尝试使用发现和oauth2构建凭据”中的代码工作正常。这就足够了:从oauth2client.contrib导入gce creds=gce.AppAssertionCredentials(scope=')客户端=gspread.authorize(creds)