使用BigQuery API从Google Sheets创建外部表时遇403权限错误
403权限错误原因及解决思路
问题背景
手动创建Google Sheets表格后,在BigQuery控制台执行以下SQL可成功创建外部表:
CREATE OR REPLACE EXTERNAL TABLE `PROJECT.DATASET.TABLE` OPTIONS ( format = 'GOOGLE_SHEETS', uris = ['https://docs.google.com/spreadsheets/d/ID'] );
但通过BigQuery API调用相同SQL时(curl代码如下),收到403错误:
BQ_QUERY=$(cat <<EOF CREATE OR REPLACE EXTERNAL TABLE \`PROJECT.DATASET.TABLE\` OPTIONS ( format = 'GOOGLE_SHEETS', uris = ['https://docs.google.com/spreadsheets/d/ID'] ); EOF ) curl -X POST \ -H "Authorization: Bearer $(gcloud auth print-access-token --account=MY_EMAIL_ADDRESS)" \ -H "Content-Type: application/json" \ -d "{\"query\": \"$BQ_QUERY\", \"useLegacySql\": false}" \ "https://bigquery.googleapis.com/bigquery/v2/projects/PROJECT/queries" | jq
错误信息:
{ "error": { "code": 403, "message": "Access Denied: BigQuery BigQuery: Permission denied while getting Drive credentials.", "errors": [ { "message": "Access Denied: BigQuery BigQuery: Permission denied while getting Drive credentials.", "domain": "global", "reason": "accessDenied" } ], "status": "PERMISSION_DENIED" } }
核心原因
出现该错误的关键是API调用使用的访问令牌缺少Google Drive相关权限范围:
- BigQuery控制台执行操作时,会自动复用你的完整用户权限(包含Drive访问权限),无需额外配置。
- 而通过
gcloud auth print-access-token默认获取的令牌,仅包含BigQuery基础操作的权限范围,没有请求Drive API的访问权限。当BigQuery需要访问Drive资源(即Google Sheets)时,无法通过该令牌获取合法的Drive访问凭证,因此触发403拒绝。
解决办法
需要显式指定包含Drive权限的范围重新获取访问令牌,修改后的命令如下:
# 获取包含BigQuery和只读Drive权限的令牌 ACCESS_TOKEN=$(gcloud auth print-access-token --account=MY_EMAIL_ADDRESS --scope=https://www.googleapis.com/auth/bigquery,https://www.googleapis.com/auth/drive.readonly) # 使用新令牌执行API请求 curl -X POST \ -H "Authorization: Bearer $ACCESS_TOKEN" \ -H "Content-Type: application/json" \ -d "{\"query\": \"$BQ_QUERY\", \"useLegacySql\": false}" \ "https://bigquery.googleapis.com/bigquery/v2/projects/PROJECT/queries" | jq
内容的提问来源于stack exchange,提问作者Maths noob
相关产品推荐
相关产品推荐

