【问题标题】:How to decode Firebase JWT token in Python如何在 Python 中解码 Firebase JWT 令牌
【发布时间】:2017-04-11 21:56:05
【问题描述】:

我添加了 Firebase 以允许客户端直接从 Web 应用客户端(浏览器)进行身份验证。我正在使用firebase-web JS 包,效果很好。我可以在浏览器中看到我收到了一个包含用户信息的用户对象,包括一个idToken

然后我需要在我的服务器后端(即 python django)上验证此用户。在 Firebase 文档中,我找到了我正在尝试做的事情的方法,即 verify the id token

由于他们没有受支持的适用于 python 的 Firebase sdk,我需要使用第三方解决方案。在 jwt.io 网站上找到 python-jose package 后,我来到了它。这个例子看起来很简单:

jwt.decode(token, 'secret', algorithms=['RS256'])

这是我第一次使用 JWT。我不知道'secret' 用什么。我尝试将我的 id 令牌粘贴为 token,并将来自 Firebase 控制台的 Web API 密钥粘贴为 secret,但收到此错误:

jose.exceptions.JWKError:不支持 RSA 密钥格式

我还尝试了JWT debugger,它似乎正确读取了我的大部分 id 令牌,但签名验证正在寻找公钥和/或私钥,就像'secret' 一样,我正在逃避。

我真的不知道如何找到这个秘密,以及如何验证 JWT id 令牌。 Firebase docs(第三方部分)的信息是:

最后,确保 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 应该适用于这种方法吗?如果是这样,我应该使用什么作为秘密?如果没有,有人能指出我正确的方向吗?

谢谢。

【问题讨论】:

  • 嗨,Jeffery,我刚刚在 Google 上搜索了一下,发现了以下库:codegists.com/snippet/python/… 我没有检查过,但值得一看。
  • 我无法保证上述库的安全性。使用它需要您自担风险。获得这方面指导的最佳地点是官方文档:firebase.google.com/docs/auth/admin/…
  • 谢谢,python-jose包的使用方法我已经搞清楚了,我会贴出答案的。

标签: python firebase jwt firebase-authentication python-jose


【解决方案1】:

我终于在这篇文章中找到了我想要的答案:Migrating Python backend from Gitkit to to Firebase-Auth with python-jose for token verification

自发帖以来,python-jose 软件包已进行了更新,它为 firebase id 令牌提供了更好的支持。以下是一些关于如何使用 python 解码 firebase id 令牌的工作代码 (jose version 1.3.1):

import urllib, json
from jose import jwt

idtoken = "<id token passed to server from firebase auth>"

target_audience = "<firebase app id>"

certificate_url = 'https://www.googleapis.com/robot/v1/metadata/x509/securetoken@system.gserviceaccount.com'

response = urllib.urlopen(certificate_url)
certs = response.read()
certs = json.loads(certs)

#will throw error if not valid
user = jwt.decode(idtoken, certs, algorithms='RS256', audience=target_audience)
print user

【讨论】:

  • 感谢@jeffery_the_wind 的示例,我认为当前的python-jose 再次更改了API 并且没有等效证书,而是只要求密钥(python-jose.readthedocs.io/en/latest/jwt/api.html)这仍然有效吗?
  • 在 1.3.2 版中,我通过类似的运行得到了这个错误:“jose.exceptions.JWKError: RSA key format is not supported”
  • 谢谢@Efren 我用工作的 jose 包版本更新了答案。我会看看新包,看看它是如何改变的。
  • 我也在使用 AWS Cognito JWT 进行测试,所以可能只是解码证书的内容需要额外转换。
  • 我发现错误是由于尝试使用键值 ('n'),在 AWS 中,证书以 JSON dicts 的形式出现,可以直接传递给 jwt.decode 作为键 - 这与 googleapis 证书不同
猜你喜欢
  • 2016-11-15
  • 2021-10-23
  • 2016-10-08
  • 2021-03-24
  • 2017-04-16
  • 2019-09-24
  • 2021-12-30
  • 2018-10-05
相关资源
最近更新 更多