gpt4 book ai didi

python - 使用 Python gdata 和 oAuth 2 对日历进行身份验证

转载 作者:太空宇宙 更新时间:2023-11-03 11:56:40 24 4
gpt4 key购买 nike

我正在将一个 Python 应用程序从 oAuth 1 迁移到 oAuth 2,它读取用户的 Google日历提要。

  • 使用 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)

这个 token 、 secret 对将长期存在。

此 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

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

提前致谢!

中号

最佳答案

马奇,

我没有看到你的堆栈跟踪的其余部分,但可以提供三个特定问题以及相应的解决方案,这些解决方案将解决你的整体问题。

问题 I:未在对象上设置值 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 后
token = gdata.gauth.OAuth2Token(...)

您只需要设置重定向 URI:

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

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

由于您调用 generate_authorize_url 时没有参数,因此使用了 redirect_uri 的默认值,目前为 oob。作为OAuth 2.0 docs state,oob 不在受支持的值中(它已被弃用)。

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

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

另外,调用generate_authorize_url获取初始token时,需要将其作为关键字参数

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)

Post Script:patch 的作者还发布了一个blog post关于使用补丁。 (请注意,当 generate_authorize_url 函数中使用关键字 redirect_url 而不是 redirect_uri 时,帖子中有错字。)

关于python - 使用 Python gdata 和 oAuth 2 对日历进行身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7199405/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com