首页 > 解决方案 > 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_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-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 与这些库一起使用时似乎没有其他人遇到过这种情况。

标签: pythonfirebasegoogle-app-enginefirebase-authenticationfirebase-admin

解决方案


问题是我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)

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


推荐阅读