10

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

然后我需要在我的服务器后端验证这个用户,这是 python django。在 Firebase 文档中,我找到了我正在尝试做的操作方法,即验证 id token

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

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

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

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

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

在此处输入图像描述

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

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

谢谢。

4

1 回答 1

12

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

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

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
于 2016-11-28T21:25:47.530 回答