许多流行站点的应用程序引擎OAuth客户端处理程序。
oauth-dropins的Python项目详细描述
加入OAuth for Python应用程序引擎!
- 关于
- 快速启动
- 使用详细信息
- 故障排除/常见问题解答
- 更改日志
- 开发
- 发布说明
- 待办事项
关于
这是许多流行站点(包括blogger、disps、dropbox、facebook、flickr、git)的初始python请求处理程序的下拉列表。hub、google、indieauth、instagram、medium、tumblr、twitter和wordpress.com。
- 在pypi上可用。 使用pip install oauth dropins安装
- 单击此处查看入门文档。
- 单击此处查看参考文档。
- 演示应用程序部署在 oauth dropins.appspot.com
需要
应用引擎python sdk
或
谷歌云软件开发工具包(又名gcloud)
使用gcloud appengine python
和gcloud appengine python附加功能
组件。所有
其他依赖项由pip处理并在
需求.txt。
我们建议您在
virtualenv。
这里是应用程序引擎的详细信息。
如果直接克隆回购协议或希望参与,请参见 有关设置说明,请参见开发。
此软件已发布到公共域。有关详细信息,请参见许可证。
快速启动
下面是使用Facebook下拉列表的完整示例。
确保你有 应用程序引擎开发包 版本1.9.15或更高版本(用于 供应商 支持)或 谷歌云软件开发工具包(又名gcloud) 安装在您的
$pythonpath
上,例如导出pythonpath=$pythonpath:/usr/local/google_appengine
。OAuth Dropins的setup.py
文件需要它g安装。将oauth dropins安装到应用程序引擎项目的某个virtualenv中 目录,例如
local/
:source local/bin/activate pip install oauth-dropins
将其添加到项目根目录中的
appengine_config.py
文件中 (背景):fromgoogle.appengine.extimportvendorvendor.add('local')fromoauth_dropins.appengine_configimport*
把你的facebook应用程序的id 在应用程序根目录中的两个纯文本文件中隐藏,
Facebook应用程序ID
和Facebook应用程序机密
。(如果你使用git,你可能会 还想将它们添加到您的.gitignore
)创建一个包含以下内容的
facebook_auth.py
文件:fromoauth_dropinsimportfacebookimportwebapp2application=webapp2.WSGIApplication([('/facebook/start_oauth',facebook.StartHandler.to('/facebook/oauth_callback')),('/facebook/oauth_callback',facebook.CallbackHandler.to('/next'))]
将这些行添加到
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处理程序接受一个perms
post查询参数,该参数可以 是read
,write
或delete
;它是 传递给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
实例 按要求。
故障排除/常见问题解答
如果出现此错误:
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
如果您正在使用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,还需要应用此解决方案(更多信息背景)。我知道,很烦人。
如果在导入或使用
tweepy
时出现错误,可能是因为未安装six.py
。尝试手动安装pip install six。tweepy
确实在其依赖项中包含了6
,因此这不应该是必需的。请如果发生这种情况,请通知我们,以便我们进行调试!如果出现这样的错误:
source local/bin/activate pip install oauth-dropins
1
…您的pythonpath
中没有/usr/local/google\appengine
,或者
你有一个相对目录。PIP需要完全限定的目录。
如果出现这样的错误:
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日
- 在云sdk 219/
app engine python中修复dev_appserver
1.9.76及更高版本。背景。 - 升级
google-api-python-client
从1.6.3到1.7.4到停止使用全局http批处理终结点 - 其他内部小更新。
1.13-2018年8月8日
- indieauth:支持json代码验证响应和表单编码(snarfed/bridgey 809)。
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
参数中重新发现,该参数将消失。
- 将授权终结点存储在state中,而不是从
1.7-2017年2月27日
- 更新捆绑的webutil库,特别是wideunicode类。
1.6-2016年11月21日
- 使用sphinx添加自动生成的文档。发表于oauth dropins.readthedocs.io
- 使用获取访问令牌修复Dropbox错误。
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 python
和gcloud 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的自述文件中也有大量重复的内容)
- 运行单元测试。
source local/bin/activate pip install oauth-dropins
4 - 在
setup.py
和docs/conf.py
中增加版本号。git grep
旧版本号,以确保它只出现在变更日志中。将此新版本的readme.md
中的当前更改日志条目从unreleased更改为当前日期。 - 建立文档。如果添加了任何新模块,请将它们添加到
docs/source/
中的相应文件中。然后运行/docs/build.sh
git commit-am'发布vx.y'
- 上传到test.pypi.org进行测试。
source local/bin/activate pip install oauth-dropins
5 - 从test.pypi.org安装python 2和3。
source local/bin/activate pip install oauth-dropins
6source local/bin/activate pip install oauth-dropins
7 - Smoke测试代码在Python2和Python3中轻松加载和运行。
source local/bin/activate pip install oauth-dropins
8source local/bin/activate pip install oauth-dropins
9 要粘贴到解释器中的测试代码:fromgoogle.appengine.extimportvendorvendor.add('local')fromoauth_dropins.appengine_configimport*
0 - 用git标记发布。在标记消息编辑器中,删除底部生成的注释,将第一行留空(以省略github中的release"title"),将
显著更改
放在第二行,然后将此版本的更改日志内容复制并粘贴到下面。fromgoogle.appengine.extimportvendorvendor.add('local')fromoauth_dropins.appengine_configimport*
1 - 单击此处在github上起草新版本。在标记版本框中输入
vx.y
。保留释放标题为空。将"显著更改"和"更改日志"内容复制到"说明"文本框中。 - 上传到pypi.org!
fromgoogle.appengine.extimportvendorvendor.add('local')fromoauth_dropins.appengine_configimport*
2
相关工作
待办事项
- 谷歌和博客需要一些爱:
- 手柄下降
- 允许重写
callbackhandler.finish()
- 支持starthandler.redirect_url()
- 允许每个应用程序有多个回调处理程序
- 清理应用程序密钥/机密文件处理。(标准化文件名?把它们放在地下室?)
- 对所有站点实施CSRF保护
- 实现blogger的v3 api