火碱身份验证verify_id_token错误"super(type, obj): obj must be an instance or subtype of type"



尝试使用firebase-auth作为身份验证系统。我已经阅读了验证ID令牌文档,并完成了Firebase SDK安装程序。使用GAE和Datastore作为后端,使用Python和webapp2框架。

无论何时尝试验证id令牌

decoded_claims = auth.verify_id_token(id_token)

我收到以下警告和错误(使用Mac(,通常使用auth模块时会发生错误,例如:尝试使用get_userget_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

该错误似乎与库requestscachecontrol有关,而与我们的代码无关。我的猜测是,这与一些库的安装有关,这些库可能缺少一些依赖项。我们将所有库安装到我们项目下的/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)

虽然很尴尬,但我会把这个留在这里,以防其他人面临同样的问题!

我也遇到了同样的问题,但遗憾的是,仅凭猴痘疫苗接种对我来说并不奏效

相关内容

最新更新