python-Google App Engine 上的社交身份验证失败

python-social-auth failure on Google App Engine

我正在尝试关注 Tutorial: Adding Facebook/Twitter/Google Authentication to a Django Application。我唯一不同的是,我是 Google App Engine 开发服务器上的 运行 DjangoAppEngine,否则一切都完全按照教程进行。

当我进入第 4 步并实际尝试使用 Facebook 进行身份验证时,出现运行时错误:

error('illegal IP address string passed to inet_pton',)

Request Method: GET
Request URL:    http://localtest.com:8080/o/complete/facebook/?redirect_state=FG4K...UG1k
Django Version: 1.6.11
Exception Type: RuntimeError
Exception Location: /Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/ext/remote_api/remote_api_stub.py in _MakeRealSyncCall, line 235
Python Executable:  /usr/local/opt/python/bin/python2.7
Python Version: 2.7.11

显然,FB 正在将批准传回我的应用程序,因为请求 URL 包含回调路径。

似乎 GoogleAppEngineLauncher 中的某些内容正在尝试查找地址,但没有收到正确的数据?我不太确定。

在尝试解决此问题时,我在某处看到一条评论,向用户建议 SimpleAuth 可能是更好的方法,但我不明白为什么,我也不是如果我只是遗漏了一些明显的东西,我真的很确定我想重新开始。

有谁知道我为什么会收到这个错误以及我可以做些什么来纠正它?

这是因为 Facebook SDK 依赖于很棒的 requests 库。但是,requests 不适用于 Google App Engine,因为该平台有一些限制。您必须使用他们的 urlfetch API 在 Google App Engine 上获取外部内容。

是的,官方 Facebook SDK 将无法运行。您必须推出自己的解决方案或找到一个有效的解决方案。 SimpleAuth 是已知有效的解决方案之一。

更新:原来的答案(以'HOWEVER'开头)不再需要,只需使用requests 2.10.0或更高版本,urllib3 1.15.1 或更高版本,以及 requests_toolbelt 0.6.2 或更高版本,并在您的 main() 中执行以下操作:

from requests_toolbelt.adapters import appengine
appengine.monkeypatch()

但是 如果您使用的是旧版本的请求 and/or urllib3,那么您需要以下补丁:

这可以使用 requests 的补丁版本和 requests-toolbelt 包来完成。适用的主题:

我已经应用了所有这些,现在 python-social-authfacebook-sdk 在本地测试(开发服务器)和生产(完整的 App Engine)中工作。

在您销售的库中,确保您有 requests_toolbelt。 (pip install -t lib requests_toolbelt)。然后 "monkeypatch" appengine 支持在 python-social-auth 调用请求之前。在我的 project/wsgi.py 中,我添加了以下行:

from requests_toolbelt.adapters import appengine
appengine.monkeypatch()

python-social-auth 依赖于 requests,因此它也应该存在于您的 vendor 目录中。

您还必须确保您使用的请求版本 >= 2.10.0。这还没有发布,所以你可以伪造它。编辑 lib/requests/__init__.py 以便 __build__ = 0x021000。您还必须将 lib/requests/packages/ 目录中 urllib3 的打包版本升级到最新版本。

这对我有用。