gpt4 book ai didi

python - 使用 python-jose 将 Python 后端从 Gitkit 迁移到 Firebase-Auth 以进行 token 验证

转载 作者:行者123 更新时间:2023-11-28 22:34:15 26 4
gpt4 key购买 nike

Over on GitHub一位乐于助人的 Google 开发人员告诉我

to create a user session, your python backend server only needs a JWT library to verify the Firebase Auth token (signature and audience) in the request and extract the user info from the token payload.

我在验证 token 时遇到问题。

这就是我所在的地方;为了开始迁移,我进行了如下操作:

  1. 我将 Firebase-Auth 添加到 Android 应用程序,同时在应用程序中仍然有 Gitkit,直到 Firebase-Auth 工作。现在我有两个登录按钮,一个用于登录 Firebase,另一个用于“几乎已弃用”的 Gitkit。

  2. 在 firebase.com 上,我将 Google 项目导入到一个新的 Firebase 项目中,因此用户数据库是相同的。我已经设法在 Android 应用程序中使用 Firebase-Auth,能够以已知用户身份登录,并且我可以通过调用 mFirebaseAuth.getCurrentUser() 成功检索后端服务器所需的 token .getToken(false).getResult().getToken().它包含与 GitKit token 相同的 user_id

现在我正在尝试替换 identity-toolkit-python-client图书馆 python-jose .因为我目前没有将 Firebase token 发送到后端,而只发送了 Gitkit token ,所以我想在 Gitkit token 上测试这个 python-jose 库。

在后端,在调用 GitKit.VerifyGitkitToken() 之前,我现在打印出 jose.jwt.get_unverified_header()jose 的结果。 jwt.get_unverified_claims() 以检查我是否能看到我所期望的。结果很好,我能够按照预期查看 Gitkit token 的内容。

我的问题来自验证。我无法使用 jose.jwt.decode() 进行验证,因为我不知道我需要使用哪个 key

jose.jwt.decode(token, key, algorithms=None, options=None, audience=None, issuer=None, subject=None, access_token=None)

我从标题中知道算法,如果有任何帮助,“aud”字段也存储在声明中。

回到工程师的评论

verify the Firebase Auth token (signature and audience)

我如何使用可用的信息来做到这一点?我猜 audience 是声明中的“aud”字段,但如何检查签名?

删除服务器上的 Gitkit 依赖项后,我将继续迁移。

据我所知,GitKit 库显然对 Google 服务器进行了“RPC”调用以进行验证,但我可能错了。

那么,Gitkit token 验证的 key 和 Firebase token 验证的 key 是哪个?

最佳答案

可获取 key

Firebase 在https://www.googleapis.com/robot/v1/metadata/x509/securetoken@system.gserviceaccount.com

Gitkit 位于https://www.googleapis.com/identitytoolkit/v3/relyingparty/publicKeys

使用 Google 的 oauth2client 库使验证变得非常容易。

但是,如果您想使用 python-jose 而不是 oauth2client,则可以使用 you first need to convert the PEM certificate into an RSA public key(更新:此问题已得到修复,对于 Firebase,此问题现在由库处理,向下滚动到末尾这条评论前面的 GitHub 链接。不确定 Gitkit)。这个公钥就是需要使用的 key 。并且受众应该从 JWT header 中提取,而是硬编码到源代码中,在 Firebase 中,受众是项目 ID,在 Gitkit 中,它是其中之一OAuth 2.0 客户端 ID,可以在 Google Developer Console Credentials 部分找到。

JWT header 中的 kid 用于选择适当的证书,该证书将用于获取用于执行验证的 key 。

  # firebase
# target_audience = "firebase-project-id"
# certificate_url = 'https://www.googleapis.com/robot/v1/metadata/x509/securetoken@system.gserviceaccount.com'

# gitkit
target_audience = "123456789-abcdef.apps.googleusercontent.com" # (from developer console, OAuth 2.0 client IDs)
certificate_url = 'https://www.googleapis.com/identitytoolkit/v3/relyingparty/publicKeys'

response = urllib.urlopen(certificate_url)
certs = response.read()
certs = json.loads(certs)
print "CERTS", certs
print ''
print ''

# -------------- verify via oauth2client
from oauth2client import crypt
crypt.MAX_TOKEN_LIFETIME_SECS = 30 * 86400 # according to https://github.com/google/identity-toolkit-python-client/blob/master/identitytoolkit/gitkitclient.py
print "VALID TOKEN", crypt.verify_signed_jwt_with_certs(idtoken, certs, target_audience)
print ''
print ''

# -------------- verify via python-jose
from jose import jwt
unverified_header = jwt.get_unverified_header(idtoken)
print "UNVERIFIED HEADER", unverified_header
print ''
print ''
unverified_claims = jwt.get_unverified_claims(idtoken)
print "UNVERIFIED CLAIMS", unverified_claims
print ''
print ''
from ssl import PEM_cert_to_DER_cert
from Crypto.Util.asn1 import DerSequence
pem = certs[unverified_header['kid']]
der = PEM_cert_to_DER_cert(pem)
cert = DerSequence()
cert.decode(der)
tbsCertificate = DerSequence()
tbsCertificate.decode(cert[0])
rsa_public_key = tbsCertificate[6]
print "VALID TOKEN", jwt.decode(idtoken, rsa_public_key, algorithms=unverified_header['alg'], audience=target_audience)

关于python - 使用 python-jose 将 Python 后端从 Gitkit 迁移到 Firebase-Auth 以进行 token 验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39123568/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com