在App Engine上认证后无法获取GData的身份验证令牌
我想获取Gdata认证的Auth Token,这样我就可以写入谷歌日历。但是在认证后,我遇到了获取这个token的问题,以便能把它发送给日历服务。
我使用的是appengine提供的默认登录界面(/_ah/login),我可以登录并进行认证,但我无法从self.request.uri中提取Auth Token,因为这个网址被重写了:
举个例子:
从kiddushfund.appspot.com/admin重定向到登录界面 https://www.google.com/accounts/ServiceLogin?service=ah&continue=http://appname.appspot.com/_ah/login%3Fcontinue%3Dhttp://appname.appspot.com/admin<mpl=gm&ahname=App+Name&sig=65e70293a754da54fe06ecbedbb59213
这是认证后的最终网址,但我再也无法提取token了 http://appname.appspot.com/admin
这看起来是个很简单的问题,任何帮助都非常感谢。谢谢。
from google.appengine.ext.webapp.util import run_wsgi_app
from google.appengine.api import users
from google.appengine.ext import webapp
import atom
import settings
import os
import urllib
import urllib2
import cookielib
import gdata.service
import gdata.auth
import gdata.alt.appengine
import gdata.calendar
import gdata.calendar.service
class Auth(webapp.RequestHandler):
def __init__(self):
self.calendar_client = gdata.calendar.service.CalendarService()
gdata.alt.appengine.run_on_appengine(self.calendar_client)
def get(self):
user = users.get_current_user()
if user:
token_request_url = None
auth_token = gdata.auth.extract_auth_sub_token_from_url(self.request.uri)
if auth_token:
self.calendar_client.SetAuthSubToken(self.calendar_client.upgrade_to_session_token(auth_token))
if not isinstance(self.calendar_client.token_store.find_token(
'http://www.google.com/calendar/feeds/'),gdata.auth.AuthSubToken):
token_request_url = gdata.auth.generate_auth_sub_url(self.request.uri,
('http://www.google.com/calendar/feeds/default/',))
#This is where I were I would look for the token but the self.request.url
# is only return http://appname.appspot.admin - with no token.
self.response.out.write(self.request.uri)
else:
self.redirect(users.create_login_url(self.request.uri))
def main():
application = webapp.WSGIApplication([('/.*', Auth),], debug=True)
run_wsgi_app(application)
if __name__ == '__main__':
main()
2 个回答
关于未使用的令牌数量是有一些限制的,比如说可以有多少个用户。那么,关于未使用的ClientLogin令牌数量又有什么限制呢?
登录界面只是用来验证用户是否可以进入你的应用程序,并不能让你直接访问用户的gdata数据。
你需要让用户授权你使用日历API - 我建议使用oauth来实现,具体可以参考这里:http://code.google.com/apis/gdata/docs/auth/overview.html#OAuth。
这个过程只需要做一次,之后你可以保存这个用户的oauth令牌,以便后续的操作使用。