我正在开发使用Python谷歌的App Engine应用程序。 而我使用:
- 谷歌日历API V3(访问日历在自己的领域。所以,这是安装在我的域名谷歌企业应用套件)
- 谷歌的API客户端库为Python。
- 的OAuth2验证我的域名的用户(name@mydomain.com)
我想我不得不使用服务帐户,因为这样:
“如果你的App Engine应用程序需要调用到应用程序的项目拥有访问数据的API,你可以通过使用服务帐户简化的OAuth 2.0”
来自https://developers.google.com/api-client-library/python/platforms/google_app_engine#ServiceAccounts
但我不知道如果我误解的东西。 是我的情景(GAE应用程序试图访问谷歌企业应用套件在我自己的域)的服务帐户的候选人?
我试过几种方法来处理的OAuth2:
- 随着服务帐户,如说
- 随着由谷歌的API客户端库的Python(OAuth2Decorator和OAuth2DecoratorFromClientSecrets)提供的Python装饰
在这两种情况下,我得到了同样的错误:
- 在我的本地机器上执行:HttpError 401请求时https://www.googleapis.com/calendar/v3/calendars/primary/events?alt=json返回“无效凭证”(我创建的事件为JSON对象,跟随这名: https://developers.google.com/google-apps/calendar/v3/reference/events/insert#examples )。 错误堆栈跟踪: https://dl.dropbox.com/u/61566717/output/local_error
- 部署到GAE:错误310(净值:: ERR_TOO_MANY_REDIRECTS)。 字符串“_ah / login_required?继续=”在URL数次结束时追加。 可以说,它是与客户端ID /客户端密钥或API控制台产生的服务帐户参数有问题? 我应该重新创建它们?
我完全失去了。 任何线索?
提前谢谢了
你并不需要一个服务帐户,但使用一个可能是有用的。 有在一个详细的App Engine服务帐户一些棘手的问题报告的问题与库。 尝试用玩弄谷歌API浏览了一下,看看是否有帮助阐明如何使用API。
只要你授权与访问那些日历帐户的应用程序,您将能够访问它们,不管这是否是在谷歌应用程序引擎。
使用OAuth2Decorator
在这里你最好的选择。 如果你给一个具体的例子,我会很乐意为完成任务提供了一些代码片段。
看到类似的问题,最近问: 我如何可以登录到任意用户的AppEngine与传动设备SDK使用? 这似乎是你的使用情况,除了要使用日历API,而不是驱动器的API。
更新:
读你之后的其他职位 (我会考虑结束,如果我是你),我拼凑一个样本,可以帮助您了解如何使用装饰起来。
首先,使用您的凭据,以便您的应用程序可以让用户进行授权:
from apiclient.discovery import build
import json
from oauth2client.appengine import OAuth2Decorator
import webapp2
decorator = OAuth2Decorator(
client_id='your_client_id',
client_secret='your_client_secret',
scope='https://www.googleapis.com/auth/calendar')
service = build('calendar', 'v3')
那么你的主页将确保您的用户登录和@decorator.oauth_required
装饰将保存的OAuth 2.0令牌的数据存储。
class MainPage(webapp2.RequestHandler):
@decorator.oauth_required
def get(self):
# This will force the user to go through OAuth
self.response.write(...)
# show some page to them
在你展示给他们的页面,你很可能有一个表单POST
s到/add-event
,这AddEvent
处理器将能够使用令牌发出请求。 而不是使用的oauth_required
我们使用@decorator.oauth_aware
,让优美的失败。 如果从他们的浏览器会话App Engine的饼干(它们如他们将请求被检测到用户POST
从一种形式),那么你的应用程序将查找的OAuth的从你的数据存储2.0凭据使认证日历请求之前。
class AddEvent(webapp2.RequestHandler):
@decorator.oauth_aware
def post(self):
if decorator.has_credentials():
event_name = self.request.get('event-name')
some_event = {...} # Create event here
# Documented at
# https://developers.google.com/google-apps/calendar/v3/reference/events/insert
http = decorator.http()
# Using 'primary' will insert the event for the current user
request = service.events().insert(calendarId='primary', body=some_event)
inserted = request.execute(http=http)
self.response.write(json.dumps(inserted))
else:
self.response.write(json.dumps({'error': 'No credentials'})
最后,以确保所有这些路由的工作,你需要定义每个处理器和装饰用的OAuth 2.0处理器路线:
app = webapp2.WSGIApplication([
('/', MainPage),
('/add-event', AddEvent),
(decorator.callback_path, decorator.callback_handler())
],
debug=True)
附加参考:
https://developers.google.com/api-client-library/python/platforms/google_app_engine
https://developers.google.com/google-apps/calendar/v3/reference/events/insert
我真的很挣扎在最近的努力,将谷歌日历。 我写了我自己的文档。 也许这将有所帮助:
http://www.tqis.com/eloquency/googlecalendar.htm