在 GCP VM 上运行时,使用应用程序默认凭据进行 Google Sheet API 访问时,使用范围会出现“范围不足”错误

1 python google-sheets

我正在尝试从 Python(在 GKE 中运行)访问 Google Sheet(读写模式)。我尝试过 outh2client 和 google-auth 方法,但每次都会给出相同的错误:

googleapiclient.errors.HttpError: <HttpError 403 when requesting https://sheets.googleapis.com/v4/spreadsheets/1kvHv1OBCzr9GnFxRu9RTJC7jjQjc9M4rAiDnhyak2Sg/values/vm_metrics%21A10?alt=json returned "Request had insufficient authentication scopes.". Details: "[{'@type': 'type.googleapis.com/google.rpc.ErrorInfo', 'reason': 'ACCESS_TOKEN_SCOPE_INSUFFICIENT', 'domain': 'googleapis.com', 'metadata': {'method': 'google.apps.sheets.v4.SpreadsheetsService.GetValues', 'service': 'sheets.googleapis.com'}}]">
Run Code Online (Sandbox Code Playgroud)

这是我使用 outh2client 的代码:

from googleapiclient.discovery import build
from oauth2client import client

creds=client.GoogleCredentials.get_application_default().create_scoped(
          ['https://www.googleapis.com/auth/spreadsheets'])
service = build('sheets', 'v4', credentials=creds)
sheet = service.spreadsheets()
sheet.values().get(spreadsheetId='whatev', range='Sheet1!A:C').execute()
Run Code Online (Sandbox Code Playgroud)

这是我使用 google-auth 的代码:

import google.auth

SCOPES = ['https://www.googleapis.com/auth/spreadsheets']

creds, project=google.auth.default(scopes=SCOPES)
service = build('sheets', 'v4', credentials=creds)
sheet = service.spreadsheets()
sheet.values().get(spreadsheetId='XXXXXXXXXX', range='Sheet1!A:C').execute()
Run Code Online (Sandbox Code Playgroud)

Dan*_*ing 5

AFAICT,这与使用应用程序默认凭据访问 Google Sheet API是同一个问题。解决方案(来自那个SO帖子)是

from googleapiclient.discovery import build
from oauth2client import client

creds = client.GoogleCredentials.get_application_default().create_scoped(
    ['https://www.googleapis.com/auth/spreadsheets.readonly']
)
response = service.spreadsheets().values().get(
    spreadsheetId='XXXXXXXXXX',
    range='Sheet1!A:C'
).execute()
rows = response['values']
Run Code Online (Sandbox Code Playgroud)

但是,这不适用于您获得的常用应用程序默认凭据gcloud auth application-default login。你会得到这个错误:

Traceback (most recent call last):
  File "<ipython-input-2-2a9ba7e9e38f>", line 8, in <module>
    sheet.values().get(spreadsheetId='1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgvE2upms', range='Class Data!A2:E''....').execute()
  File "/Users/dking/miniconda3/lib/python3.7/site-packages/googleapiclient/_helpers.py", line 130, in positional_wrapper
    return wrapped(*args, **kwargs)
  File "/Users/dking/miniconda3/lib/python3.7/site-packages/googleapiclient/http.py", line 855, in execute
    raise HttpError(resp, content, uri=self.uri)
HttpError: <HttpError 403 when requesting https://sheets.googleapis.com/v4/spreadsheets/1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgvE2upms/values/Class%20Data%21A2%3AE....?alt=json returned "Request had insufficient authentication scopes.">
Run Code Online (Sandbox Code Playgroud)

修复实际上非常简单!感谢James在评论中指出了这一点。您必须扩展应用程序默认凭据的 OAuth 范围以包含 Google Sheets API,并且还必须设置 Google Sheets 用于速率限制的配额项目。在撰写本文时,没有记录使用 Sheets API 的成本,但每个项目每分钟有 300 个请求限制。

Traceback (most recent call last):
  File "<ipython-input-2-2a9ba7e9e38f>", line 8, in <module>
    sheet.values().get(spreadsheetId='1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgvE2upms', range='Class Data!A2:E''....').execute()
  File "/Users/dking/miniconda3/lib/python3.7/site-packages/googleapiclient/_helpers.py", line 130, in positional_wrapper
    return wrapped(*args, **kwargs)
  File "/Users/dking/miniconda3/lib/python3.7/site-packages/googleapiclient/http.py", line 855, in execute
    raise HttpError(resp, content, uri=self.uri)
HttpError: <HttpError 403 when requesting https://sheets.googleapis.com/v4/spreadsheets/1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgvE2upms/values/Class%20Data%21A2%3AE....?alt=json returned "Request had insufficient authentication scopes.">
Run Code Online (Sandbox Code Playgroud)

  • 我三个小时的研究和调试的结局真是悲伤。 (2认同)