根据RFC 7516,应该可以加密有效载荷/声明,称为JWE.
有没有支持它的python库?
我已经检查了PyJWT,python-jose和jwcrypto,但他们都只是用HS256
(JWS)签名的例子.
对不起,如果这是非常明显的,但是当谈到涉及加密的事情时,我会格外谨慎.
我添加了Firebase以允许客户端直接从Web应用程序客户端(浏览器)进行身份验证.我使用的是firebase-web JS软件包,效果很好.我可以在浏览器中看到我收到一个用户对象,其中包含有关用户的信息,包括idToken
.
然后我需要在我的服务器后端验证这个用户,这是python django.在Firebase文档中,我找到了我正在尝试做的操作方法,即验证id令牌.
由于他们没有python支持的Firebase sdk,我需要使用第三方解决方案.我发现它在jwt.io网站上列出后,我来到了python-jose包.该示例看起来很简单:
jwt.decode(token, 'secret', algorithms=['RS256'])
Run Code Online (Sandbox Code Playgroud)
这是我第一次使用JWT.我不知道该用什么'secret'
.我尝试将我的ID令牌粘贴为token
,以及来自Firebase控制台的Web API密钥secret
,但出现此错误:
jose.exceptions.JWKError:不支持RSA密钥格式
我也尝试过JWT调试器,它似乎正在正确读取我的大部分id令牌,但是签名验证正在寻找一个公钥和/或私钥,就像'secret'
逃避我一样.
我真的不知道如何找到这个秘密,以及如何验证JWT id令牌.在信息火力地堡文档(第三方节)是:
最后,确保ID令牌由与令牌的孩子声明相对应的私钥签名.从https://www.googleapis.com/robot/v1/metadata/x509/securetoken@system.gserviceaccount.com获取公钥, 并使用JWT库验证签名.使用来自该端点的响应的Cache-Control标头中的max-age值来了解何时刷新公钥.
我已经尝试将整个json blob从googleapis url粘贴到JWT调试器中,但仍然收到"无效签名"警报.我不明白如何使用该公钥.
python-jose应该为这种方法工作吗?如果是这样,我应该用什么秘密?如果没有,有人能指出我正确的方向吗?
谢谢.
INFO:Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit)
INFO:Started reloader process [27528] using statreload
C:Python\Python39\lib\site-packages\jose\backends\cryptography_backend.py:18:
CryptographyDeprecationWarning: int_from_bytes is deprecated, use int.from_bytes
instead from cryptography.utils import int_from_bytes, int_to_bytes
INFO: Started server process [8912]
INFO: Waiting for application startup.
INFO: Application startup complete.
Run Code Online (Sandbox Code Playgroud)
我是 FastAPI 的新手,因为我在项目中实现 JWT 令牌,API 正常工作,但每次启动服务器时都会显示此警告。
我已经从 jose 导入了 jwt,并从 passlib.context python 版本 3.9 导入了 CryptContext
我真的很想知道这背后的原因是什么!
我有一个函数,它接收一个令牌,对其进行解码,然后使用有效负载来执行一些逻辑。我想用我操纵的声明来生成令牌以测试该函数。
我从https://mkjwk.org/生成了一个密钥对,并按以下方式使用它:
from jose import jwt
claims = {"hello": "world"}
key = {
"kty": "RSA",
"d": "RSjC9hfDtq2G3hQJFBI08hu3CJ6hRRlhs-u9nMFhdSpqhWFPK3LuLVSWPxG9lN7NQ963_7AturR9YoEvjXjCMZFEEqewNQNq31v0zgh9k5XFdz1CiVSLdHo7VQjuJB6imLCF266TUFvZwQ4Gs1uq6I6GCVRoenSe9ZsWleYF--E",
"e": "AQAB",
"use": "sig",
"kid": "1234567890",
"alg": "RS256",
"n": "thBvC_I9NciW6XqTxUFMZaVVpvGx6BvLHd3v8Visk_6OoDCVXF_6vNktNi6W7CBkuHBqGyuF0wDFrHcZuZq_kLKI6IRofEzKyUoReOyYRlPt5ar64oDO-4mwH47fb99ILW94_8RpQHy74hCnfv7d888YaCmta9iOBOvggcvxb5s"
}
token = jwt.encode(
{"hello": "world"},
key,
algorithm="RS256",
)
jwt.decode(token, key, algorithms="RS256") == claims
Run Code Online (Sandbox Code Playgroud)
以上是给我一个jose.exceptions.JWTError: Signature verification failed.
错误。
为什么是这样?我如何生成一个令牌,我可以用我想要的声明正确解码?