尝试使用 firebase auth 作为身份验证系统。我已经阅读了 verify ID token docs并通过了Firebase SDK Setup .使用 GAE 和 Datastore 作为后端,Python 和 webapp2 框架。
每当尝试验证 id token 时
decoded_claims = auth.verify_id_token(id_token)
我收到以下警告和错误(使用 Mac),使用 auth
时发生错误一般模块,例如:尝试使用时 get_user
, get_user_by_email
...等
警告
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 (仍然无法正常工作) 这似乎是一种解决方法,而不是直接使用 Admin 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.adapters.appengine.monkeypatch
行。我不记得为什么在导入 firebase 和凭据和身份验证后将其向下移动。但由于某种原因,它被向下移动,从而导致错误发生。
错误的位置:
import webapp2
import requests_toolbelt.adapters.appengine
from firebase_admin import credentials
from firebase_admin import auth
import firebase_admin
cred = credentials.Certificate(myjson)
default_app = firebase_admin.initialize_app(cred)
requests_toolbelt.adapters.appengine.monkeypatch() # <-- wrong placement!
正确的位置:
import webapp2
import requests_toolbelt.adapters.appengine
requests_toolbelt.adapters.appengine.monkeypatch() # <-- correct placement!
from firebase_admin import credentials
from firebase_admin import auth
import firebase_admin
cred = credentials.Certificate(myjson)
default_app = firebase_admin.initialize_app(cred)
虽然很尴尬,但我会保留在这里,以防其他人遇到同样的问题!
关于python - Firebase 身份验证 verify_id_token 错误 "super(type, obj): obj must be an instance or subtype of type",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51581962/