使用服务帐户 Google BigQuery API 时出现登录要求错误

Posted

技术标签:

【中文标题】使用服务帐户 Google BigQuery API 时出现登录要求错误【英文标题】:Login Required error using service account Google BigQuery API 【发布时间】:2016-11-02 10:47:06 【问题描述】:

我编写了一个 python 脚本,它调用 BigQuery 的插入 API 来将数据插入到表中。我使用服务帐户进行 OAuth 身份验证。它运行了几天,但现在它给出了需要登录的错误(401)。以下是代码:

scopes = ['https://www.googleapis.com/auth/bigquery']

credentials =ServiceAccountCredentials.from_json_keyfile_name('/home/ubuntu/aha/udofy.json', scopes=scopes)

service = discovery.build('bigquery', 'v2', credentials=credentials)

job_body =   #Body JSON

request = service.jobs().insert(projectId=projectId, body=job_body)

response = request.execute()

我在 UI 上检查作业日志时看到以下错误:



"error": 

 "errors": [
   

    "domain": "global",
    "reason": "required",
    "message": "Login Required",
    "locationType": "header",
    "location": "Authorization"
   
  ],

  "code": 401,

  "message": "Login Required"

 


API 响应

u'configuration': u'query': u'createDisposition': u'CREATE_IF_NEEDED',
                               u'destinationTable': u'datasetId': u'co_gradeup_android_ANDROID',
                                                     u'projectId': u'udofy-1021',
                                                     u'tableId': u'user_answer_attempts',
                               u'query': u' SELECT user_dim.user_id as user_id, event_dim.params.value.string_value as post_id, DATE(USEC_TO_TIMESTAMP(event_dim.timestamp_micros)) as attempt_date, count(*) as attempt_count FROM [udofy-1021:co_gradeup_android_ANDROID.app_events_20161101] WHERE event_dim.name =\'Answer_Selected\' and event_dim.params.key = \'postId\' and user_dim.user_id is not null and user_dim.user_id != "" group by 1,2,3 ',
                               u'writeDisposition': u'WRITE_APPEND',
 u'etag': u'', #User_etag
 u'id': u'', #User_Id
 u'jobReference': u'jobId': u'job_C9kSTaEOQBw0VPBEF_Yj44C0-Us',
                   u'projectId': u'udofy-1021',
 u'kind': u'bigquery#job',
 u'selfLink': u'https://www.googleapis.com/bigquery/v2/projects/udofy-1021/jobs/job_C9kSTaEOQBw0VPBEF_Yj44C0-Us',
 u'statistics': u'creationTime': u'1478082742163',
                 u'startTime': u'1478082742420',
 u'status': u'state': u'RUNNING',
 u'user_email': u'' #service_account_email

【问题讨论】:

【参考方案1】:

服务帐号无权访问相关的大查询项目。服务帐号不是你,需要预授权。

不知道您是否可以授予其他用户对项目的访问权限,但您是否可以获取服务帐户电子邮件地址并将其添加为用户。

这完全取决于您的服务帐户代码是否正常工作。我的蟒蛇技能有限,我将不得不假设它是正确的。

【讨论】:

服务帐户电子邮件地址已添加到具有编辑权限的项目用户仪表板中。会不会是 OAuth 令牌过期的情况,因为它以前可以正常工作到今天? 服务帐户不会过期,只要他们有权访问并且项目没有在 Google 开发者控制台上被删除或重新生成。 两者都没有发生。我在单独的本地服务器上运行代码。这有什么不同吗? 服务器应该无关紧要,尽管您运行的是什么版本的库?就像我说的我不是 python 专家。尝试对某种服务进行 var 转储。 我使用的是 1.5.5 版的 google-api-python-client。我应该分享 vardump 的输出吗?所有具有所需值的变量似乎都很好。【参考方案2】:

问题在于作业正文中查询的输出架构/格式与通过插入 API 插入数据的表的架构不匹配。在作业正文中执行的查询发生了微小的变化。

查询的输出格式完全相同与必须插入的输出数据中的表架构。 p>

【讨论】:

以上是关于使用服务帐户 Google BigQuery API 时出现登录要求错误的主要内容,如果未能解决你的问题,请参考以下文章

如何使用服务帐户确定 Google BigQuery 作业的状态?

使用 JS 的服务帐户调用 Google bigquery

使用服务帐户 Google BigQuery API 时出现登录要求错误

如何通过服务帐户通过 Google BigQuery External Table 访问 Google Sheets Doc

通过 R Studio Server 使用 BigQuery 在 Google Compute Engine 上对服务帐户进行身份验证

如何使用 Python + 服务帐户创建 BigQuery 数据传输?