当前位置: 首页 > 知识库问答 >
问题:

如何在Python中解码Firebase JWT令牌

端木承业
2023-03-14

我添加了Firebase,允许客户端直接从web应用程序客户端(浏览器)进行身份验证。我正在使用firebase web JS包,它工作得非常好。我可以在浏览器中看到,我收到一个用户对象,其中包含有关该用户的信息,包括idToken

然后,我需要在我的服务器后端(即python django)上对该用户进行身份验证。在Firebase文档中,我找到了一个我正试图做的操作指南,即验证id令牌。

因为他们没有支持的Firebase sdk for python,所以我需要使用第三方解决方案。我在jwt上找到了python jose包。io站点。这个例子看起来很简单:

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

这是我第一次使用JWT。我不知道如何使用“秘密”。我尝试将id令牌粘贴为令牌,并将Firebase控制台中的web API密钥粘贴为机密,但出现以下错误:

何塞。例外情况。JWKError:不支持RSA密钥格式

我还尝试了JWT调试器,它似乎正确地读取了我的大部分id令牌,但是签名验证正在寻找公共和/或私钥,这就像秘密一样。

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

最后,确保ID令牌由与令牌的kid声明相对应的私钥签名。从中获取公钥https://www.googleapis.com/robot/v1/metadata/x509/securetoken@系统。gserviceaccount。com并使用JWT库来验证签名。在来自该endpoint的响应的缓存控制标头中使用max age的值,以了解何时刷新公钥。

我尝试将googleapis url中的整个json blob粘贴到JWT调试器中,但仍然得到一个“无效签名”警报。我不明白如何使用公钥。

python应该为这种方法工作吗?如果是这样,我应该用什么来保密?如果没有,有人能给我指出正确的方向吗?

谢谢

共有1个答案

卫乐童
2023-03-14

我终于在这篇文章中找到了我想要的答案:将Python后端从Gitkit迁移到Firebase Auth,使用Python jose进行令牌验证

自发布之日起,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
 类似资料:
  • 我想解码我使用Postman收到的jwt令牌,并在RESTAPI中实现它。我该怎么做?我看到有人发布代码来解码jwt令牌(参考:如何在不使用库的情况下在javascript中解码jwt令牌?)但我不明白在《邮差》里怎么做?解码jwt需要什么url?需要什么标题、授权?

  • 问题内容: 我用python脚本下载了一个网页。在大多数情况下,这可以正常工作。 但是,这个有一个响应标头:GZIP编码,当我尝试打印此网页的源代码时,它的腻子中包含所有符号。 如何将其解码为普通文本? 问题答案: 我使用zlib从Web解压缩压缩的内容。

  • 我不明白这个图书馆是如何工作的。你能帮帮我吗? 以下是我的简单代码: 这是错误: 字符串需要采用紧凑的JSON格式,格式为:Base64UrlEncodedHeader。Base64UrlEndcodedPayload。可选,Base64UrlEncodedSignature'。 如果你复制流在jwt.io网站,它的作品罚款:)

  • 问题内容: 我目前正在使用Golang应用程序。我从客户端收到JWT令牌,在Go中,我需要对该令牌进行解码并获取以下信息:用户,名称等。我正在检查可用于处理JWT的库令牌,我来到https://github.com/dgrijalva/jwt- go ,但我看不到如何简单地制作所需的东西。 我有令牌,我需要将信息解码为地图或至少为json。在哪里可以找到如何做的指南?谢谢! 问题答案: 函数接受第

  • 问题内容: 试图在Swift中解码JWT有效负载并遇到困难 问题答案: 不是有效的Base64编码字符串,因为它的长度不是4的倍数。某些Base64解码器可以容忍此错误,但方法不能。 因此,这实际上是在服务器端创建Base64编码的字符串时出现的错误。如有必要,您可以通过添加所需的字符填充来在应用程序中对其进行修复(已为Swift 2更新了代码): 现在解码可以按预期进行: 斯威夫特4:

  • 问题内容: 我在包含XML的数据库中有很多行,并且试图编写Python脚本来计算特定节点属性的实例。 我的树看起来像: 如何使用Python访问XML中的属性“1”和“2”? 问题答案: 我建议ElementTree。相同的API还有其他兼容的实现,例如和在标准库本身中。但是,在这种情况下,他们主要添加的是更高的速度-编程的难易程度取决于定义的API 。 首先用 构建 的实例,例如使用函数,或者通