我和this guy的情况相同(只是我的问题是python):我正在尝试使用服务帐户检索数据(使用this example并在阅读{{3}后因为我的应用程序是一个谷歌应用程序)但我遇到了需要登录错误,我无法理解为什么。
让我用一个完整的例子来代表它:
In [1]: import httplib2
In [2]: from apiclient.discovery import build
In [3]: from oauth2client.client import SignedJwtAssertionCredentials
In [4]: f = open('abd45679ffg32343-privatekey.p12', 'rb')
In [5]: key = f.read()
In [6]: f.close()
In [7]: credentials = SignedJwtAssertionCredentials(
'2127313127654990@developer.gserviceaccount.com', key,
scope=['https://www.googleapis.com/auth/calendar',
'https://www.googleapis.com/auth/calendar.readonly'])
In [8]: http = httplib2.Http()
In [9]: http = credentials.authorize(http)
In [10]: service = build(serviceName='calendar', version='v3', http=http,
....: developerKey='XcddfRgtyt676grggtT')
2012-05-14 18:24:35,170 INFO [root][MainThread] URL being requested: https://www.googleapis.com/discovery/v1/apis/calendar/v3/rest
2012-05-14 18:24:35,170 INFO [oauth2client.client][MainThread] Attempting refresh to obtain initial access_token
2012-05-14 18:24:35,179 INFO [oauth2client.client][MainThread] Refresing access_token
In [11]: service.calendarList().list().execute()
2012-05-14 18:25:00,418 INFO [root][MainThread] URL being requested https://www.googleapis.com/calendar/v3/users/me/calendarList?alt=json&key=XcddfRgtyt676grggtT
---------------------------------------------------------------------------
HttpError Traceback (most recent call last)
/home/mariano/Code/Kalendar/rest/kalendar/<ipython-input-12-0cb769615d74> in <module>()
----> 1 service.calendarList().list().execute()
/home/mariano/Code/Kalendar/rest/env/local/lib/python2.7/site-packages/google_api_python_client-1.0beta8-py2.7.egg/apiclient/http.pyc in execute(self, http)
387
388 if resp.status >= 300:
--> 389 raise HttpError(resp, content, self.uri)
390 return self.postproc(resp, content)
391
HttpError: <HttpError 403 when requesting https://www.googleapis.com/calendar/v3/users/me/calendarList?alt=json&key=XcddfRgtyt676grggtT returned "The user must be signed up for Google Calendar.">
关于为什么会发生这种情况以及如何解决它的任何指示都将非常感激。
答案 0 :(得分:1)
服务帐户可用,并为我使用Calendar API。
您需要更改以下声明:
credentials = SignedJwtAssertionCredentials('2127313127654990@developer.gserviceaccount.com', key, scope=['https://www.googleapis.com/auth/calendar', 'https://www.googleapis.com/auth/calendar.readonly'])
到
credentials = SignedJwtAssertionCredentials('2127313127654990@developer.gserviceaccount.com', key, scope=['https://www.googleapis.com/auth/calendar', 'https://www.googleapis.com/auth/calendar.readonly'], prn='requestor@domain.com')
答案 1 :(得分:1)
服务帐户可以使用Calendar API。您还必须在您的域管理上授予访问权限。
按用户1260486和btspierre说,并将"prn=requestor@domain.com"
添加到SignedJWTAssertionCredentials
的构造函数中。
然后转到您的域管理并添加您对API的client_id
访问权限。
这是关于它的walkthrough。
对于范围,请指定"https://www.googleapis.com/auth/calendar, https://www.googleapis.com/auth/calendar.readonly"
答案 2 :(得分:0)
我不认为服务帐户可用于Calendar API。服务帐户没有自己的日历。