使用服务帐户登录所需错误Google BigQuery API

时间:2016-11-02 10:47:06

标签: python google-api google-bigquery google-oauth google-api-python-client

我编写了一个python脚本,调用BigQuery的插入API以将数据插入表中。我使用服务帐户进行OAuth身份验证。它正常运行了几天,但现在它给出了Login Required错误(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

2 个答案:

答案 0 :(得分:0)

服务帐户无权访问相关的大型查询项目。服务帐户不是您,需要预先授权。

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

这取决于您的服务帐户代码是否有效。我的python技能是有限的我将不得不承担它的权利。

答案 1 :(得分:0)

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

查询的输出格式完全相同,因为必须插入输出数据中的表架构