在 python 中验证并解析 Auth0 JWT 令牌

Qua*_*ive 1 jwt auth0 jwk

当有人通过 Auth0 登录我的网站时,我会从 Auth0 获取 JWT 令牌。该令牌告诉我此人的 UID,并允许我从前端向后端进行 API 调用,在后端我可以验证 JWT 令牌以确保请求来自已登录的用户。

https://jwt.io上,您可以粘贴任何 JWT 令牌,它会解析它并验证签名。

有谁知道我如何在 python 中做到这一点?

Auth0 没有给我 JWT 令牌的私钥,所以我无法使用jwt.decode().

相反,我需要以某种方式用它的公钥解析 JWT 令牌,但我不确定如何在 python 中检索它。

这是 JWT 令牌:

eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6ImZneF9xWEJVNWt0ZzZXSlNLdTJIdiJ9.eyJuaWNrbmFtZSI6ImpvaG5fbWFyayIsIm5hbWUiOiJqb2huX21hcmtAb3V0bG9vay5jb20iLCJwaWN0dXJlIjoiaHR0cHM6Ly9zLmdyYXZhdGFyLmNvbS9hdmF0YXIvNTMxZmJlZjcxN2I1NzVmYjU3MGJlYzcxNTBlOWQ4MTA_cz00ODAmcj1wZyZkPWh0dHBzJTNBJTJGJTJGY2RuLmF1dGgwLmNvbSUyRmF2YXRhcnMlMkZqby5wbmciLCJ1cGRhdGVkX2F0IjoiMjAyMi0wNC0wNVQxNDoyMzozNy42NTFaIiwiZW1haWwiOiJqb2huX21hcmtAb3V0bG9vay5jb20iLCJlbWFpbF92ZXJpZmllZCI6ZmFsc2UsImlzcyI6Imh0dHBzOi8vZGV2LW44Z2h5a3lvLnVzLmF1dGgwLmNvbS8iLCJzdWIiOiJhdXRoMHw2MTdiZTllMzJhMmYyNjAwNmEzZDlhM2EiLCJhdWQiOiIwUGwwR1F5cFhjNkZEakxhb0JuSjhzOEtNZjVKZ3J4bSIsImlhdCI6MTY0OTE2ODYyMiwiZXhwIjoxNjQ5MjA0NjIyLCJub25jZSI6IlJuTjBmbFoyU0Vkck4wSkhRV1EyY21FMk1rNUpXVlUzTW1jM2RtaHlXVkJWYm5oalowMUNUR1paU3c9PSJ9.NQBQPoEj6wzYzclrQzXAWh124gyg_Nf1UYZR4lAuqHZ-fdFycrBMA0Y0dBSvQ-WI7YZOMAPjCRK0nuxKzj9kMQ0c-3finCgsl411tX5tvaX_Khe116le_eyBV28aQQLjqT0zvLaSgIYaJqcgshQ1bYvJp8UXPf8GkMWCD89pnqYPwexx9nsWjrnikInLY9oSbWYN1zA7DxwhygI_JeQc6Cvu6pl1xq8m_WZaCMSOJS2umyl_7vfA84cDX1Zz8aVWEOMinnbmR48sY79cEiIMplcYJA3QH4yFEawSWbzWnVUcv9VCgCJ7fCbqikF86fz2TrWYrI6eATJoVHOXDNDKwA
Run Code Online (Sandbox Code Playgroud)

jps*_*jps 5

当然你不会得到私钥。但私钥仅用于对令牌进行签名。您只需要公钥来验证令牌。该jwt.decode()函数称为解码,但也验证令牌,这就是需要密钥的原因。

文档告诉您在哪里可以找到带有公钥的 JWKS(JSON Web 密钥集)。

Auth0 为每个租户公开一个 JWKS 端点,该端点可在 https://YOUR_DOMAIN/.well-known/jwks.json 中找到。此端点将包含用于验证该租户的所有 Auth0 颁发的 JWT 的 JWK。

颁发者 URL 也编码在声明中的令牌中(当您在https://jwt.ioiss上检查令牌时可以看到它):

在你的情况下: https://dev-n8ghykyo.us.auth0.com/.well-known/jwks.json

然后,您可以使用此答案中显示的代码从该端点检索密钥