【问题标题】:Can not get the Auth Token for GData After Authentication on App Engine在 App Engine 上进行身份验证后无法获取 GData 的身份验证令牌
【发布时间】:2011-01-07 05:26:13
【问题描述】:

我想提取 Gdata 身份验证的身份验证令牌,以便我可以写入谷歌日历。我在身份验证后获取令牌时遇到问题,以便我可以将令牌发送到日历服务。

我正在使用 appengine (/_ah/login) 提供的默认登录屏幕,并且我能够登录并进行身份验证,但是,我无法从 self.request.uri 中提取身份验证令牌,因为 URL 是正在重写:

例子:

来自 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&ltmpl=gm&ahname=App+Name&sig=65e70293a754da54fe06ecbedbb59213

这是在身份验证之后,并且 URL 是从 firebug 中提取出来的 http://appname.appspot.com/_ah/login?continue=http://appname.appspot.com/admin&auth=DQAAAL0AAAD9X_Noig8blUlg_KA02UbjgBC2yWl8XKXIVA3SI5ZQ7pJOyL4SyYPpKu5jOLAw0ol0rSUVBENBMmWC2DkH6sTxx3AlSF4UI_LcByDlacBV3Fy1At80h_ML97fLeu0LLQbgzuLxY_wTHBb5svkCVDOeVABFKf98qvZ62SGl0PrDTxs1P3lCF04ooDdFilDecGUoED6hbnjd9P7-6eqxOO9nrBCSk571uyWZCLIA-1I5f3Om_MqAIPmi_5mqLXOSv0I

这是身份验证后的最终 URL,但我无法再提取令牌 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()

【问题讨论】:

    标签: python google-app-engine gdata-api gdata google-data-api


    【解决方案1】:

    登录屏幕仅对您的应用程序的用户进行身份验证,它不授予您对用户的 gdata 的授权。

    您需要让用户授权您使用日历 api - 我建议通过 oauth 在这里:http://code.google.com/apis/gdata/docs/auth/overview.html#OAuth

    您只需执行一次,然后为该用户存储 oauth 令牌以供所有后续调用使用。

    【讨论】:

    • 感谢您的澄清并为我指明正确的方向。我发现对我有用的解决方案是code.google.com/apis/gdata/docs/auth/clientlogin.html 解决方案是在我调用 gdata.calendar.service.CalendarService() 之后调用 client.ClientLogin(email,password, source=application_name)
    • 虽然当然可以使用客户端登录方法,但有些用户会谨慎地向您提供他们的用户名和密码。如果他们更改密码或电子邮件地址,您将需要再次要求。但是,如果您使用 oauth 或 authsub 方法,如果他们按照我的理解更改了用户名和密码,则无需询问用户名和密码。如果您需要重复访问 gdata api,则需要考虑一些事项。
    【解决方案2】:

    未偿代币的数量有限制 - 例如可能的用户数量。未完成的 ClientLogin 令牌数量如何?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-21
      • 2021-06-17
      • 2015-01-02
      • 1970-01-01
      • 2021-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多