尝试使用Firebase身份验证作为身份验证系统。我已阅读verify ID token docs,并经历了Firebase SDK Setup。使用GAE和数据存储作为后端,Python和webapp2框架。
每当尝试验证ID令牌
decoded_claims = auth.verify_id_token(id_token)
我得到以下警告和错误(在Mac上),通常在使用auth
模块时发生错误,例如:尝试使用get_user
,get_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
该错误似乎与requests
和cachecontrol
库有关,而与我们的代码无关。我的猜测是,这与某些库的安装有关,这些库可能缺少某些依赖项。我们将所有库安装到项目下的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身份验证与这些库一起使用时,似乎没有其他人遇到过这种情况。
答案 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版本的有效方法