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

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

尝试使用 firebase auth 作为身份验证系统。我已经阅读了 verify ID token docs并通过了Firebase SDK Setup .使用 GAE 和 Datastore 作为后端,Python 和 webapp2 框架。

每当尝试验证 id token 时

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

错误似乎与库有关 requestscachecontrol而不是与我们的代码相关的东西。我的猜测是,这与某些可能缺少某些依赖项的库的安装有关。我们将所有库安装到 /lib我们项目下的文件夹,如图所示in the docs here使用:

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 身份验证时似乎没有其他人遇到过这种情况。

最佳答案

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

虽然很尴尬,但我会保留在这里,以防其他人遇到同样的问题!

关于python - Firebase 身份验证 verify_id_token 错误 "super(type, obj): obj must be an instance or subtype of type",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51581962/

相关文章:

python - 下载后如何在协作环境中的特定文件夹中解压缩文件?

typescript - 如何解决错误 'TS2532: Object is possibly ' undefined'?

google-app-engine - 在本地运行 Go App Engine 应用程序。

html - Firebase 未经授权的访问

node.js - 如何从App Engine获取真实请求客户端的IP

google-app-engine - 使用 Nginx 托管 Docusaurus v2

赋值中的Python逻辑

python:UnboundLocalError:赋值前引用的局部变量 'open'

python - MousePressEvent,QGraphicsView中的位置偏移

javascript - [Vue 警告] : Property or method "games" is not defined on the instance but referenced during render