尝试使用firebase-auth作为身份验证系统。我已经阅读了验证ID令牌文档,并完成了Firebase SDK安装程序。使用GAE和Datastore作为后端,使用Python和webapp2框架。
无论何时尝试验证id令牌
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
文件夹中,如文档中所示,使用:
sudo pip install -t <path>/lib <library>
包括firebase管理员的安装,即sudo pip install -t <path>/lib firebase-admin
将Firebase SDK更新到2.12.0,尝试删除并重新安装Firebase auth,使用第三方JWT库读取验证ID令牌(在使其工作时仍有问题(这似乎是一种变通方法,而不是直接使用Admin SDK,而且更有意义。有人知道TypeError: super(type, obj): obj must be an instance or subtype of type
错误的解决方案吗?
更新1
通过阅读另一个超级((褶皱——引发关于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 auth时,似乎没有其他人遇到过这种情况。。
问题是我在代码中放错了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)
虽然很尴尬,但我会把这个留在这里,以防其他人面临同样的问题!
我也遇到了同样的问题,但遗憾的是,仅凭猴痘疫苗接种对我来说并不奏效