【发布时间】:2019-01-05 23:53:34
【问题描述】:
尝试使用 firebase auth 作为身份验证系统。我已经阅读了verify ID token docs 并阅读了Firebase SDK Setup。使用 GAE 和 Datastore 作为后端,Python 和 webapp2 框架。
每当尝试验证 id 令牌时
decoded_claims = auth.verify_id_token(id_token)
我收到以下警告和错误(使用 Mac),通常在使用 auth 模块时发生错误,例如:尝试使用 get_user、get_user_by_email...等时。 em>
警告
Warning: urllib3 is using URLFetch on Google App Engine sandbox instead of sockets. To use sockets directly instead of URLFetch see https://urllib3.readthedocs.io/en/latest/reference/urllib3.contrib.html.
错误
File /<mypath>/lib/cachecontrol/adapter.py", line 26, in __init__
super(CacheControlAdapter, self).__init__(*args, **kw)
File "/<mypath>/lib/requests/adapters.py", line 121, in __init__
super(HTTPAdapter, self).__init__()
TypeError: super(type, obj): obj must be an instance or subtype of type
错误似乎与库requests 和cachecontrol 相关,与我们的代码无关。我的猜测是,这与安装一些可能缺少某些依赖项的库有关。我们将所有库安装到项目下的/lib 文件夹中,如in the docs here 所示,使用:
sudo pip install -t <path>/lib <library>
包括安装 firebase-admin 即 sudo pip install -t <path>/lib firebase-admin
将 Firebase SDK 更新到 2.12.0,尝试删除并重新安装 Firebase 身份验证,通读 Verify ID tokens using a third-party JWT library (仍然无法正常工作) 这似乎是一种解决方法,而不是使用管理员SDK直接,更有意义。有人知道TypeError: super(type, obj): obj must be an instance or subtype of type 错误的解决方案吗?
更新 1
阅读Another super() wrinkle – raising TypeError 关于TypeError,我检查了文件adapters.py 中的第121 行,并记录在错误输出中
/lib/requests/adapters.py", line 123, in __init__
super(HTTPAdapter, self).__init__()
并添加了上述博客中提到的打印语句
print "HTTPAdapter", HTTPAdapter
print isinstance(self, HTTPAdapter)
并得到相同的 False 输出结果!
HTTPAdapter <class 'requests_toolbelt.adapters.appengine.AppEngineAdapter'>
True
HTTPAdapter <class 'requests_toolbelt.adapters.appengine.AppEngineAdapter'>
True
HTTPAdapter <class 'requests_toolbelt.adapters.appengine.AppEngineAdapter'>
True
HTTPAdapter <class 'requests_toolbelt.adapters.appengine.AppEngineAdapter'>
True
HTTPAdapter <class 'requests_toolbelt.adapters.appengine.AppEngineAdapter'>
True
HTTPAdapter <class 'requests_toolbelt.adapters.appengine.AppEngineAdapter'>
True
HTTPAdapter <class 'requests_toolbelt.adapters.appengine.AppEngineAdapter'>
True
HTTPAdapter <class 'requests_toolbelt.adapters.appengine.AppEngineAdapter'>
True
HTTPAdapter <class 'requests_toolbelt.adapters.appengine.AppEngineAdapter'>
False
所以显然这似乎被多次调用,isinstance 在最后一次调用失败时引发错误..
不知道为什么在将 Firebase 身份验证与这些库一起使用时似乎没有其他人遇到过这种情况..
【问题讨论】:
-
您是否安装了
requests-toolbelt,并按照 App Engine 的附加设置说明进行操作? google-auth.readthedocs.io/en/latest/… -
是的,我早先这样做了,并按照stackoverflow.com/questions/9604799/…中的步骤进行操作
-
我打开了一个 python 终端并尝试从那里使用 SDK 目录(而不是从本地 Google App Engine 运行!),它可以在终端上运行!所以它显然与库和依赖项有关。因为 GAE 库安装在单独的
lib文件夹中。我尝试将系统路径中的一些文件与 GAElib文件夹中的文件进行比较,例如:requests、cachecontrol、jwt但我相信它们要么是相同的版本,要么是 @ 987654352@实际上是更新的! -
在进行了一些调试之后,我偶然发现了thingspython.wordpress.com/2010/09/27/…,它讨论了使用
super时何时引发此错误并且代码中发生模块重新加载。不确定,为什么没有其他人出现此错误,因为它似乎与requests/adapters.pymodule... -
我尝试删除 firebase-admin(最新版本 2.12.0)并使用 2.9.0 版本而不是
pip install -t ./lib/ "firebase-admin==2.9.0"重新安装它,并且函数 get_user_by_phone_number 正常工作!函数 verify_id_token 给出了权限被拒绝错误。不幸的是,这意味着最新版本不适用于此设置环境(!),这意味着会话 cookie 等新功能将无法访问!
标签: python firebase google-app-engine firebase-authentication firebase-admin