python - Firebase Auth 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_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-admin即 sudo pip install -t <path>/lib firebase-admin
将 Firebase SDK 更新到 2.12.0,尝试删除并重新安装 Firebase 身份验证,使用第三方 JWT 库 通读验证 ID 令牌(仍然无法正常工作),这似乎是一种解决方法,而不是直接使用 Admin SDK更有意义。任何人都知道围绕该TypeError: super(type, obj): obj must be an instance or subtype of type
错误的解决方案?
更新 1
通读另一个 super() 皱纹 - 引发关于 TypeError 的TypeError,我检查了文件中的第 121 行,adapters.py
并记录在错误输出中
/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)
虽然很尴尬,但我会把这个留在这里,以防其他人面临同样的问题!
推荐阅读
- javascript - Javascript垂直选项卡无法正常工作
- c# - 如何确定 MultiDataTrigger 的问题来自何处?
- php - 带有附加字符串的 Woocommerce URL
- django - 使用 ModelForms 保存 ManyToManyFields
- amazon-web-services - 亚马逊弹性搜索中的索引元数据是否适用于加密内容?
- datatables - Datatables excel pdf按钮不显示 - jquery datatable
- django - 如何通过请求从 django 模板发送数据以查看功能?
- python - 在 sql 查询中绑定列表很大的列表
- asp.net-mvc - MVC 项目中没有 sln 文件。有什么办法生成吗?
- ruby - 如何使用我的代码中使用的拆分方法生成预期的输出?