使用Python gdata和oAuth 2对Calendar进行身份验证

时间:2011-08-26 02:23:28

标签: python gdata oauth-2.0

我正在将oAuth 1中的Python应用程序迁移到读取用户Google的oAuth 2 日历饲料。

  • 使用oAuth 1: 我的应用程序将打开浏览器,用户可以使用他的GMail进行身份验证 帐户和授权访问权限,我的应用程序将获得user_token, 该用户的user_secret,然后对日历提要进行身份验证:

    client = gdata.calendar.client.CalendarClient(source='test')
    client.auth_token = gdata.gauth.OAuthHmacToken(app_key,
             app_secret,user_token,user_secret,gdata.gauth.ACCESS_TOKEN)
    

这个令牌,秘密对将是长寿。

此access_token是短暂的。

我使用此处发布的代码http://codereview.appspot.com/4440067/播放了一些内容 并且工作正常。

我的问题:

- 我通过来自我的curl调用获取access_token,refresh_token 应用程序,我可以成功检索两者。但是,当我申请时 这段代码:

    token =
    gdata.gauth.OAuth2Token(client_id=client_id,client_secret=client_secret',
                           scope='https://www.google.com/calendar/
    feeds',user_agent='calendar-cmdline-sample/1.0')
    uri = token.generate_authorize_url()
    token.get_access_token(access_token)

它给了我:

Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
 File "/Library/Python/2.6/site-packages/gdata/gauth.py", line 1267,
in get_access_token
   raise OAuth2AccessTokenError(error_msg)
gdata.gauth.OAuth2AccessTokenError

- 假设我可以成功完成上述操作,我可以在DB中保存访问/刷新令牌。使用python gdata lib,我如何使用refresh_token请求另一个access_token(因此每次使用应用程序授权访问时都不必询问用户)

提前多多谢谢!

中号

1 个答案:

答案 0 :(得分:1)

Marchie,

我没有看到您的堆栈跟踪的其余部分,但可以通过相应的解决方案提出三个特殊问题,以解决您的整体问题。

问题我:未在对象上设置值redirect_uri

请注意get_access_token

中如何指定请求正文
body = urllib.urlencode({
  'grant_type': 'authorization_code',
  'client_id': self.client_id,
  'client_secret': self.client_secret,
  'code': code,
  'redirect_uri': self.redirect_uri,
  'scope': self.scope
  })

这取决于在对象上设置的redirect_uri属性到最初在generate_authorize_url中设置的值。因此,在通过调用

重构令牌之后
token = gdata.gauth.OAuth2Token(...)

您只需设置重定向URI:

token.redirect_uri = 'http://path/that/you/set'

问题II redirect_uri的默认值不正确(更具体地说,已弃用)。

由于您在没有参数的情况下调用了generate_authorize_url,因此使用了redirect_uri的默认值,该值目前为oob。作为OAuth 2.0 docs状态,oob不属于受支持的值(已弃用)。

如果您确实使用的是已安装的应用程序,则需要将其设置为

token.redirect_uri = 'urn:ietf:wg:oauth:2.0:oob'

此外,当您致电generate_authorize_url获取初始令牌时,您需要将其用作关键字参数

url = token.generate_authorize_url(redirect_uri='urn:ietf:wg:oauth:2.0:oob')

问题III :您使用不正确的值(也是未在代码段中实例化的值)调用get_access_token

您应该使用授权后收到的代码的字符串值或使用'code'作为键的字典来调用它。

这可以通过以下方式完成:

import atom.http_core

# Page the user is redirected to after authorizing
redirected_page = 'http://path/that/you/set?code=RANDOM-CODE'
uri = atom.http_core.ParseUri(redirected_page)

# uri.query is a dictionary with the query string as key, value pairs
token.get_access_token(uri.query)

发布脚本patch的作者也使用该修补程序发布了blog post。 (请注意,在redirect_url函数中使用关键字redirect_uri而非generate_authorize_url时,帖子中会出现拼写错误。)