用于向python请求http库添加开放身份验证支持的钩子。

requests-oauth的Python项目详细描述


#请求OAuth

此插件将OAuth v1.0支持添加到http://github.com/kennethritz/rel="nofollow">https://github.com/kennethritz">;@kennethritz<;/a>;知名的<;a href="http://github.com/kennethritz/requests" rel="nofollow">http://github.com/kennethritz/requests">;请求<;/a>;库PR提供头和URL编码的身份验证。

请求oauth希望提供在python中执行oauth的最简单和最简单的方法。它最初是基于:https://github.com/simplegeo/python-oauth2" rel="nofollow">https://github.com/simplegeo/python-oauth2">;python-oauth2<;/a>;(看起来未维护),作者和贡献者为将oauth提供给python httplib2付出了巨大努力。从那时起,代码库已经被清理干净,修复了几个bug,并对其进行了大量重构,以消除与python-oauth2的依赖关系,而python-oauth2现在是一个独立的插件。

##安装

您只需执行以下操作即可安装oauth请求:

< Buff行情> PIP安装请求OAuth

##用法

导入挂钩操作:

< Buff行情> 从oauth_hook导入oauthhook

您可以通过5个参数初始化钩子:access_tokenaccess_token_secretconsumer_keyconsumer_secretheader_auth。前两个访问令牌访问令牌是可选的,以防您想从api服务检索它们(参见后面的示例)。有两种方法可以初始化钩子。第一个:

< Buff行情> oauth_hook=oauthhook(访问令牌、访问令牌秘密、使用者密钥、使用者秘密、头身份验证)

header\u auth参数允许您选择所使用的身份验证方法。这是一个布尔值,如果将其设置为true则将使用授权头。如果您的api支持这种身份验证方法,那么它就是您应该使用的方法,也是oauth规范(http://tools.ietf.org/html/rfc5849-section-3.5 rel="nofollow">http://tools.ietf.org/html/rfc5849-section-3.5">;rfc5849<;/a>;)推荐的方法,例如twitter的api。默认情况下,header\u auth设置为false,这意味着将使用url编码的身份验证。这是因为这是最广泛支持的身份验证系统。

如果您一直使用相同的使用者密钥使用者密钥,则可能需要设置那些已修复的密钥,这样您只需传递用于设置挂钩的令牌参数即可:

< Buff行情> oauthhook.consumer_key=用户密钥 oauthhook.consumer\u secret=消费者秘密 oauth_hook=oauthhook(访问令牌,访问令牌,机密,头认证=true)

现在您需要将钩子传递给python请求,您可能希望将其作为会话来执行,因此您不必每次都执行此操作:

< Buff行情> client=requests.session(hooks={'pre_request':oauth_hook})

您得到的是python请求客户端,您可以使用与使用请求api相同的方法。让我们看一个get示例:

< Buff行情> response=client.get('http://api.twitter.com/1/account/rate_limit_status.json') results=json.loads(response.content)

还有一个帖子示例:

< Buff行情> response=client.post('http://api.twitter.com/1/statuses/update.json',{'status':"耶!它起作用了!","包装链接":true})

##三腿授权

首次授权和授权阳离子遵循一个名为"三脚OAuth"的系统,该系统在<;a href="https://dev.twitter.com/docs/auth/implementing sign twitter">;twitter文档中有很好的描述。

基本上它由三个步骤组成。让我们看一个基于imgur的api的示例。所有其他api的工作方式几乎相同,只有端点(url)更改:

####步骤1:获取请求令牌

我们开始请求一个请求令牌,它最终将变成一个访问令牌,这是我们需要代表用户操作的令牌。

< Buff行情> imgur_oauth_hook=oauthhook(consumer_key=your_imgur_consumer_key,consumer_secret=your_imgur_consumer_secret) response=requests.post('http://api.imgur.com/oauth/request廑token',hooks={'pre廑request':imgur廑oauth廑hook}) qs=解析qs(response.text) oauth_token=qs['oauth_token'][0] oauth_secret=qs['oauth_token_secret'][0]

####步骤2:重定向用户以获取授权

在这一步中,我们为用户提供一个链接或打开一个web浏览器,将其重定向到一个端点,并将上一步中获得的oauth_令牌作为url参数传递。用户将得到一个对话框,要求授权我们的应用程序。在这种情况下,我们正在做一个带外桌面应用程序,因此用户将不得不为我们输入一个名为verifier的代码。在web应用程序中,我们将以webhook的形式获取此代码。

< Buff行情> print"转到http://api.imgur.com/oauth/authorize?OAuth_令牌=%s允许应用程序并复制您的PIN%OAuth_令牌 oauth_verifier=raw_input('请输入您的PIN:')

####第3步:验证

一旦我们得到用户的授权,我们就请求一个最终的访问令牌,代表用户进行操作。我们使用在步骤1中获得的先前请求令牌信息构建一个新的钩子,并使用oauth\u验证器将验证器(在步骤2中获得)作为数据传递 < Buff行情> new_imgur_oauth_hook=oauthhook(oauth_token,oauth_secret,imgur_consumer_key,imgur_consumer_secret) response=requests.post('http://api.imgur.com/oauth/access戥u token',{oauth戥u verifier':oauth戥u verifier},hooks={pre戥request':new戥imgur戥ou oauth response=解析(response.content) final_token=响应['oauth_token'][0] final_token_secret=响应['oauth_token_secret'][0]

这些final_tokenfinal_token_secret是处理用户OAuth所需的凭据,因此您很可能希望以某种方式持久化它们。这些是使用新钩子构建请求会话时应该使用的。请注意,并非所有OAuth API都提供无限时间凭据。

##测试

如果要运行测试,则需要将test_settings.py.template复制到test_settings.py中。此文件位于.gitignore索引中,因此不会提交:

< Buff行情> cp test_settings.py.template test_settings.py

然后在那里填写信息。库的测试是以一种功能性的方式完成的,对公共的oauth api(如twitter)执行get和post操作,因此使用一个测试帐户而不是您的个人帐户:

< Buff行情> ./tests.py

##贡献

如果您想贡献,只需分叉存储库,将您的更改提交到dev分支(或其分支),然后发送一个pull请求。请确保将自己添加到作者中。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
javascript如何找到socket。同一局域网上的IO服务器?   将Java代码格式化为Word/RTF格式   java学习对象以及如何将分配的变量封装到私有变量   java Websocket客户端不在Tomcat中工作   java如何在点击按钮时打开本机表情键盘?   java使用哪个Maven GlassFish插件?   Eclipse Java构建路径不允许添加外部JAR   继承Java6集合。勾选适当的用法   JavaApacheDateUtils:使用多个模式解析日期   java hibernate如何生成查询?   具有id或链接的java Dropbox下载文件或文件夹   java模态对话框未在PrimeFaces 5上显示   java将类对象转换为人类可读的字符串   更新数据库中字段的java通用方法   java无法通过Apache Tomcat访问网络文件夹