许多流行站点的应用程序引擎OAuth客户端处理程序。

oauth-dropins的Python项目详细描述


oauth logocircle ci

加入OAuth for Python应用程序引擎!

关于

这是许多流行站点(包括blogger、disps、dropbox、facebook、flickr、git)的初始python请求处理程序的下拉列表。hub、google、indieauth、instagram、medium、tumblr、twitter和wordpress.com。

需要 应用引擎python sdk谷歌云软件开发工具包(又名gcloud) 使用gcloud appengine pythongcloud appengine python附加功能 组件。所有 其他依赖项由pip处理并在 需求.txt。 我们建议您在 virtualenv这里是应用程序引擎的详细信息。

如果直接克隆回购协议或希望参与,请参见 有关设置说明,请参见开发。

此软件已发布到公共域。有关详细信息,请参见许可证。

快速启动

下面是使用Facebook下拉列表的完整示例。

  1. 确保你有 应用程序引擎开发包 版本1.9.15或更高版本(用于 供应商 支持)或 谷歌云软件开发工具包(又名gcloud) 安装在您的$pythonpath上,例如 导出pythonpath=$pythonpath:/usr/local/google_appengine。OAuth Dropins的 setup.py文件需要它g安装。

  2. 将oauth dropins安装到应用程序引擎项目的某个virtualenv中 目录,例如local/

    source local/bin/activate
    pip install oauth-dropins
    
  3. 将其添加到项目根目录中的appengine_config.py文件中 (背景):

    fromgoogle.appengine.extimportvendorvendor.add('local')fromoauth_dropins.appengine_configimport*
  4. 把你的facebook应用程序的id 在应用程序根目录中的两个纯文本文件中隐藏, Facebook应用程序IDFacebook应用程序机密。(如果你使用git,你可能会 还想将它们添加到您的.gitignore

  5. 创建一个包含以下内容的facebook_auth.py文件:

    fromoauth_dropinsimportfacebookimportwebapp2application=webapp2.WSGIApplication([('/facebook/start_oauth',facebook.StartHandler.to('/facebook/oauth_callback')),('/facebook/oauth_callback',facebook.CallbackHandler.to('/next'))]
  6. 将这些行添加到app.yaml

    -url:/facebook/(start_oauth|oauth_callback)script:facebook_oauth.applicationsecure:always
哇!当您希望用户连接时,将他们发送到/facebook/start_auth 他们的Facebook帐户会转到你的应用程序,完成后,他们会被重定向 下一个?访问令牌=…在您的应用程序中。

所有站点都提供相同的api。要使用另一个,只需导入 你想要的站点模块并遵循相同的步骤。应用程序密钥和 秘密也因地点而异; appengine-config.py 有完整的列表。

使用详细信息

oauth插件有三个主要部分:初始重定向到站点 在用户批准或拒绝 请求,以及存储用户的oauth凭据和 帮助你使用它们。这些由starthandler实现, callbackhandler,以及验证实体, 分别是。

请求处理程序已满,可能是 用于任何支持wsgi的python web框架 (pep 333)。在内部,他们 使用webapp2实现。

启动程序

这个http请求处理程序类将您重定向到启用oauth的站点,以便它可以 授予应用程序权限的用户。它有两种有用的方法:

  • to(回调路径,scopes=none)是返回请求的工厂方法 可以在wsgi应用程序中使用的处理程序类。争论应该是 在您的应用程序中映射到callbackhandler的路径。这个 通常还需要匹配应用程序配置中的回调url 目的地。

    如果要在登录所需的默认范围之外添加OAuth范围, 您可以将它们作为字符串或字符串序列传递给作用域 将它们包含在post请求正文中的scopes查询参数中。这是 目前支持Facebook、Google、Blogger和Instagram。

    一些使用oauth 1的站点支持替代方案。对于Twitter, starthandler.to需要一个额外的access\u类型 或者写。已经传到了Twitter上 x_auth_access_type。 对于flickr,start处理程序接受一个permspost查询参数,该参数可以 是readwritedelete;它是 传递给flickr 不变。(flickr声称这是可选的,但是 如果没有提供,有时会中断。

  • 重定向URL(state=none)返回要重定向到的目标URL 启动OAuth流的站点。starthandler将在此处重定向 如果它在wsgi应用程序中使用,则会自动执行,但您也可以实例化 如果您想控制自己的重定向,请手动调用它:

classMyHandler(webapp2.RequestHandler):defget(self):...handler_cls=facebook.StartHandler.to('/facebook/oauth_callback')handler=handler_cls(self.request,self.response)self.redirect(handler.redirect_url())

不过,这是目前谷歌和blogger支持的而非。有希望地 以后会修好的。

回调处理程序

在用户授予 或者拒绝许可。它还有两种有用的方法:

  • to(回调路径)是返回请求处理程序类的工厂方法 您可以在wsgi应用程序中使用,类似于starthandler。 回调路径是应用程序中用户应重定向到的路径 在oauth流完成之后。它将包含一个状态查询参数 使用starthandler提供的值。它还将包括一个OAuth 查询参数中的token,或者是oauth 2.0的access\u token 用于OAuth 1.1的访问令牌密钥访问令牌密钥。它也会 使用 有更多数据(和功能)的认证实体 经过身份验证的用户。如果用户拒绝了oauth授权请求,则 除了state之外,只有查询参数才会被拒绝=true

  • finish(auth_entity,state=none)在之后的初始回调请求中运行 已处理OAuth响应。身份验证实体是新创建的身份验证 此连接的实体,或者如果用户拒绝了OAuth 授权请求。

    默认情况下,finish会重定向到在to()中指定的路径 可以子类化callbackhandler并重写它以在 OAuth回调而不是重定向:

classMyCallbackHandler(facebook.CallbackHandler):deffinish(self,auth_entity,state=None):self.response.write('Hi %s, thanks for connecting your %s account.'%(auth_entity.user_display_name(),auth_entity.site_name()))

不过,这是目前谷歌和blogger支持的而非。有希望地 以后会修好的。

验证实体

每个站点定义一个应用程序引擎数据存储 ndb.model类 存储每个用户的oauth凭据和其他有用信息,如 他们的名字和个人资料网址。类名的形式是siteauth,例如。 facebook认证。以下是一些有用的方法:

  • site_name()返回站点的可读字符串名称,例如。 "脸谱网"。

  • user_display_name()返回用户可读的字符串名称,例如。 "瑞安·巴雷特"。这通常是他们的名字、全名或用户名。

  • access_token()返回OAuth访问令牌。对于OAuth 2站点,这是 单根绳子。对于oauth 1.1站点(目前只有twitter、tumblr和flickr)。 这是一个(string key,string secret)元组。

以下方法是可选的。auth实体类通常在 其中至少一个,但不是全部。

  • api()返回特定于站点的api对象。这通常是第三方 网站专用库,例如tweepy 或者python instagram。见 站点类的docstring以获取详细信息。

  • urlopen(data=none,timeout=none)wrappsurllib2.urlopen()和DDS OAuth请求的凭据。使用此命令向 站点的rest api。有些站点可能会提供get()来代替 请求.get()

  • http()返回一个添加OAuth凭据的httplib2.http实例 按要求。

故障排除/常见问题解答

  1. 如果出现此错误:

    bash: ./bin/easy_install: ...bad interpreter: No such file or directory
    

您可能已经碰到了这个打开的virtualenv错误(已修复但未合并):virtualenv不支持带有空格的路径。

简单的解决方法是在没有空格的路径中重新创建virtualenv。如果您不能这样做,那么在创建virtualenv之后,但在激活它之前,请编辑local/bin/中的activate、easy_install和pip文件,以转义路径中的任何空格。

例如,在激活虚拟环境="…/has space/local"变为虚拟环境="…/has\space/local",在PIP轻松安装中,第一行从更改!…/has space/local/bin/python"!"…/has\space/local/bin/python"

这将使virtualenv安装在正确的位置。如果您一开始这样做是错误的,那么您将安装在需要删除的/usr/local/lib/python2.7/site packages中,因为它们将阻止virtualenv安装到本地site packages

  1. 如果您正在使用twitter,并且导入请求或类似的操作失败:

    ImportError: cannot import name certs
    

    或者您会看到一个异常,例如:

    File ".../site-packages/tweepy/auth.py", line 68, in _get_request_token
      raise TweepError(e)
    TweepError: must be _socket.socket, not socket
    

    …您需要配置应用程序引擎的ssl。将此添加到您的app.yaml

    source local/bin/activate
    pip install oauth-dropins
    
    0

如果您使用dev_appserver,还需要应用此解决方案更多信息背景)。我知道,很烦人。

  1. 如果在导入或使用tweepy时出现错误,可能是因为未安装six.py。尝试手动安装pip install six。tweepy确实在其依赖项中包含了6,因此这不应该是必需的。请如果发生这种情况,请通知我们,以便我们进行调试!

  2. 如果出现这样的错误:

    source local/bin/activate
    pip install oauth-dropins
    
    1

…您的pythonpath中没有/usr/local/google\appengine,或者 你有一个相对目录。PIP需要完全限定的目录。

  1. 如果出现这样的错误:

    source local/bin/activate
    pip install oauth-dropins
    
    2

…您可能正在点击pip bug 1833。 是否将-t传递到pip install?改用virtualenv,它是你的 朋友.如果您真的需要-t,请尝试从 requirements.freeze.txt有它的。

更改日志

2.0-2019年2月25日

  • 打破改变:从google+登录将于3月关闭)切换到谷歌登录。值得注意的是,这删除了googleplus的模块,并添加了一个新的google登录模块,重命名了googleplusauth类到googleauth,并删除其api()方法。否则,实现基本相同。
  • webutil.logs:如果开始时间早于2018-04-01(应用程序引擎的大致启动窗口),则返回http 400。

1.14-2018年11月12日

1.13-2018年8月8日

1.12-2018年3月24日

  • webutil.util中的更多Python3更新和错误修复。

1.11-2018-03-08

  • 添加github!
  • 脸谱网:
    • 状态直接传递到初始OAuth端点,而不是将其编码到重定向URL中,这样重定向就可以匹配严格模式白名单
  • 将Python3支持添加到webutil.util!
  • 为webutil.logs添加人性化依赖项。

1.10-2017年12月10日

主要是对webutil的内部更改,以支持granary v1.10。

1.9-2017年10月24日

主要是对webutil的内部更改,以支持granary v1.9。

    Flickr:
    • 处理错误消息中的标点符号。

1.8-2017年8月29日

  • 脸谱网:
    • 将Graph API从v2.6升级到v2.10。
  • Flickr:
    • 修复已损坏的flickrauth.urlopen()方法。
  • 中:
    • 用于处理中等OAuth回调错误的错误修复。
  • 独立:
    • 将授权终结点存储在state中,而不是从me参数中重新发现,该参数将消失。

1.7-2017年2月27日

  • 更新捆绑的webutil库,特别是wideunicode类。

1.6-2016年11月21日

1.5-2016年8月25日

1.4-2016年6月27日

  • 将Facebook API从v2.2升级到v2.6。

1.3-2016年4月7日

  • 添加indieauth
  • 更一致地记录http请求。
  • 准备工作服。

1.2-2016年1月11日

    Flickr:
    • 添加上传方法。
    • 改进错误处理和日志记录。
  • 用于构造作用域字符串的错误修复和清除。
  • 添加开发人员设置和疑难解答文档。
  • 设置圆圈。

1.1-2015年9月6日

  • flickr:拆分flickr_auth.py文件。
  • 向webutil添加多个实用程序函数。

1.0-2015年6月27日

  • 初始PYPI版本。

开发

你需要 应用程序引擎开发包 版本1.9.15或更高版本(用于 供应商 支持)或 google云sdk(也称为gcloud) 使用gcloud appengine pythongcloud appengine python附加功能 组件。 将它们添加到$pythonpath中,例如 导出pythonpath=$pythonpath:/usr/local/google\u appengine,然后运行:

source local/bin/activate
pip install oauth-dropins
3

大多数依赖项都是干净的,但是我们已经做了补丁 到下面的gdata python client 我们还没有努力向上游推进。如果我们切换它的子模块 回购,确保补丁包括在内!

要部署:

python-m unittest discover&;git push&;gcloud-q app deploy oauth dropins*.yaml

这些文档是用sphinx构建的,包括 apidoc自动文档,以及 拿破仑。配置 是在 docs/conf.py 要构建它们,首先使用pip install sphinx安装sphinx。(你可能想 在virtualenv之外执行此操作;如果是,则需要重新配置它才能看到 带有virtualenv--system site packages local的系统包,然后运行 docs/build.sh

发布说明

下面介绍如何打包、测试和发布新版本。(请注意,这是在granary的自述文件中也有大量重复的内容

  1. 运行单元测试。
    source local/bin/activate
    pip install oauth-dropins
    
    4
  2. setup.pydocs/conf.py中增加版本号。git grep旧版本号,以确保它只出现在变更日志中。将此新版本的readme.md中的当前更改日志条目从unreleased更改为当前日期。
  3. 建立文档。如果添加了任何新模块,请将它们添加到docs/source/中的相应文件中。然后运行/docs/build.sh
  4. git commit-am'发布vx.y'
  5. 上传到test.pypi.org进行测试。
    source local/bin/activate
    pip install oauth-dropins
    
    5
  6. 从test.pypi.org安装python 2和3。
    source local/bin/activate
    pip install oauth-dropins
    
    6
    source local/bin/activate
    pip install oauth-dropins
    
    7
  7. Smoke测试代码在Python2和Python3中轻松加载和运行。
    source local/bin/activate
    pip install oauth-dropins
    
    8
    source local/bin/activate
    pip install oauth-dropins
    
    9 要粘贴到解释器中的测试代码:
    fromgoogle.appengine.extimportvendorvendor.add('local')fromoauth_dropins.appengine_configimport*
    0
  8. 用git标记发布。在标记消息编辑器中,删除底部生成的注释,将第一行留空(以省略github中的release"title"),将显著更改放在第二行,然后将此版本的更改日志内容复制并粘贴到下面。
    fromgoogle.appengine.extimportvendorvendor.add('local')fromoauth_dropins.appengine_configimport*
    1
  9. 单击此处在github上起草新版本。标记版本框中输入vx.y。保留释放标题为空。将"显著更改"和"更改日志"内容复制到"说明"文本框中。
  10. 上传到pypi.org
    fromgoogle.appengine.extimportvendorvendor.add('local')fromoauth_dropins.appengine_configimport*
    2

相关工作

待办事项

  • 谷歌和博客需要一些爱:
    • 手柄下降
    • 允许重写callbackhandler.finish()
    • 支持starthandler.redirect_url()
    • 允许每个应用程序有多个回调处理程序
  • 清理应用程序密钥/机密文件处理。(标准化文件名?把它们放在地下室?)
  • 对所有站点实施CSRF保护
  • 实现blogger的v3 api

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

推荐PyPI第三方库


热门话题
为什么按钮点击播放声音的方法不起作用   java如何在创建小于窗口的PGraphics对象时避免“抗锯齿效应”,然后将其放大到窗口大小?   作用域中的java Antlr check返回语句   java是否在swing中显示所有鼠标悬停事件?   编辑:JAVA(Swing):JAVA(Swing)中是否有任何功能可以像javafx中的webview一样保存Html页面   java GPS文本输入   如何使用Java SE生成多个jasper报告   swing Java ActionListener未拾取按钮   性能为什么java内置序列化比Gson差?   java JAXR使用相同路径创建多个类   java Spring MVC 3.1请求头字符编码问题[UTF8]   java从Hibernate处理的h2数据库的表中删除会损坏该表吗?   Java Mybatis多个更新语句   找不到java JUnitCore类   java扩展SpringWebFlow 2.3