如何在云作曲家环境中获得合适的凭据以调用 google 工作表 API?
How can I obtain suitable credentials in a cloud composer environment to make calls to the google sheets API?
当 运行ning python 代码通过云作曲家时,我希望能够访问 google sheet 上的数据;当 运行 在本地编写代码时,我知道如何通过多种方式做到这一点,但事实证明,迁移到云端具有挑战性。特别是,我希望以作曲家服务帐户身份进行身份验证,而不是将 client_secret.json 文件的内容存储在某处(无论是源代码还是某个云位置)。
对于本质上相同的问题,但不是访问 google 云平台服务,由于 google-cloud_* libraries,这相对容易(即使 运行 通过 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)
并且可以通过与作曲家服务帐户共享(或不共享)'test dataset' 来管理此操作的成功或失败。
同样,从云存储桶中获取数据工作正常:
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 控制访问。
但是,为了与 google sheets 一起工作,我似乎必须求助于 Google APIs python 客户端,在这里我 运行陷入困境。大多数关于此的文档(这似乎是一个移动的目标!)假设本地代码执行,从创建和存储 client_secret.json 文件 example 1, example 2 开始,我在本地理解,但对具有源代码控制的共享云环境。因此,我尝试了几种方法:
尝试使用发现和 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 错误
'Request had insufficient authentication scopes.'
但是,我不知道这是否意味着我成功地将自己显示为服务帐户,然后被认为不适合访问(所以我需要更多地处理权限);或者实际上并没有走那么远(并且需要修复此凭据创建过程)。
使用 google.auth 获取凭证对象并传递给 gspread
我的(有限)理解是 oauth2client 正在 deprecated 并且 google.auth 是现在要走的路。这会以与我上面针对云平台服务的成功示例类似的简单方式生成凭据对象,我希望我可以将其传递给 gspread:
import gspread
from google.auth import compute_engine
credentials = compute_engine.Credentials()
client = gspread.authorize(credentials)
遗憾的是,gspread 不适用于这些对象,因为它们没有它期望的属性:
AttributeError: 'Credentials' object has no attribute 'access_token'
这大概是因为 gspread 需要 oauth2 凭据,而那些被 google.auth 丢弃的凭据不够兼容。 gspread docs 也下降了 'just get a client_secret file'... 但大概如果我能让以前的 (oauth/http-based) 方法起作用,我就可以使用 gspread 进行数据检索。不过,目前,这两种方法的混合以同样的方式失败:由于身份验证范围不足而导致权限被拒绝响应。
因此,无论是使用 google.auth、oauth2(假设它会保留一段时间)还是其他一些云友好的方法(即不是基于存储密钥的方法),如何在云作曲家环境中获得合适的凭据来调用 google sheets API?与 gspread 兼容的方式的奖励标记(因此 gspread_dataframe),但这不是必需的。也很高兴听到这是一个 PEBCAK 错误,我只需要为我当前的工作方法配置不同的 IAM 权限。
您的 Composer 环境 oauthScopes 配置似乎未正确设置。如果未指定,默认的云平台不允许您访问 Google 工作表 API。您可能希望使用 oauthScopes = [ 创建一个新的 Composer 环境
"https://www.googleapis.com/auth/spreadsheets",
“https://www.googleapis.com/auth/cloud-platform”]。
Google 张 API 参考:https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/create。
当 运行ning python 代码通过云作曲家时,我希望能够访问 google sheet 上的数据;当 运行 在本地编写代码时,我知道如何通过多种方式做到这一点,但事实证明,迁移到云端具有挑战性。特别是,我希望以作曲家服务帐户身份进行身份验证,而不是将 client_secret.json 文件的内容存储在某处(无论是源代码还是某个云位置)。
对于本质上相同的问题,但不是访问 google 云平台服务,由于 google-cloud_* libraries,这相对容易(即使 运行 通过 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)
并且可以通过与作曲家服务帐户共享(或不共享)'test dataset' 来管理此操作的成功或失败。
同样,从云存储桶中获取数据工作正常:
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 控制访问。
但是,为了与 google sheets 一起工作,我似乎必须求助于 Google APIs python 客户端,在这里我 运行陷入困境。大多数关于此的文档(这似乎是一个移动的目标!)假设本地代码执行,从创建和存储 client_secret.json 文件 example 1, example 2 开始,我在本地理解,但对具有源代码控制的共享云环境。因此,我尝试了几种方法:
尝试使用发现和 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 错误'Request had insufficient authentication scopes.'
但是,我不知道这是否意味着我成功地将自己显示为服务帐户,然后被认为不适合访问(所以我需要更多地处理权限);或者实际上并没有走那么远(并且需要修复此凭据创建过程)。
使用 google.auth 获取凭证对象并传递给 gspread
我的(有限)理解是 oauth2client 正在 deprecated 并且 google.auth 是现在要走的路。这会以与我上面针对云平台服务的成功示例类似的简单方式生成凭据对象,我希望我可以将其传递给 gspread:
import gspread
from google.auth import compute_engine
credentials = compute_engine.Credentials()
client = gspread.authorize(credentials)
遗憾的是,gspread 不适用于这些对象,因为它们没有它期望的属性:
AttributeError: 'Credentials' object has no attribute 'access_token'
这大概是因为 gspread 需要 oauth2 凭据,而那些被 google.auth 丢弃的凭据不够兼容。 gspread docs 也下降了 'just get a client_secret file'... 但大概如果我能让以前的 (oauth/http-based) 方法起作用,我就可以使用 gspread 进行数据检索。不过,目前,这两种方法的混合以同样的方式失败:由于身份验证范围不足而导致权限被拒绝响应。
因此,无论是使用 google.auth、oauth2(假设它会保留一段时间)还是其他一些云友好的方法(即不是基于存储密钥的方法),如何在云作曲家环境中获得合适的凭据来调用 google sheets API?与 gspread 兼容的方式的奖励标记(因此 gspread_dataframe),但这不是必需的。也很高兴听到这是一个 PEBCAK 错误,我只需要为我当前的工作方法配置不同的 IAM 权限。
您的 Composer 环境 oauthScopes 配置似乎未正确设置。如果未指定,默认的云平台不允许您访问 Google 工作表 API。您可能希望使用 oauthScopes = [ 创建一个新的 Composer 环境 "https://www.googleapis.com/auth/spreadsheets", “https://www.googleapis.com/auth/cloud-platform”]。
Google 张 API 参考:https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/create。