Firebase Auth verify_id_token错误“ super(type,obj):obj必须是类型的实例或子类型”

时间:2018-07-29 15:45:01

标签: python firebase google-app-engine firebase-authentication firebase-admin

尝试使用Firebase身份验证作为身份验证系统。我已阅读verify ID token docs,并经历了Firebase SDK Setup。使用GAE和数据存储作为后端,Python和webapp2框架。

每当尝试验证ID令牌

decoded_claims = auth.verify_id_token(id_token)

我得到以下警告和错误(在Mac上),通常在使用auth模块时发生错误,例如:尝试使用get_userget_user_by_email时。 ..etc。

警告

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库有关,而与我们的代码无关。我的猜测是,这与某些库的安装有关,这些库可能缺少某些依赖项。我们将所有库安装到项目下的in the docs here下的/lib文件夹中,使用:

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身份验证与这些库一起使用时,似乎没有其他人遇到过这种情况。

2 个答案:

答案 0 :(得分:2)

问题是我在代码中放错了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)

虽然令人尴尬,但如果有人遇到相同问题,我会保留在这里!

答案 1 :(得分:0)

我遇到了同样的问题,但遗憾的是,仅monkeypatching对我不起作用,是将firebase-admin切换到2.9.1版本的有效方法