使用pythonjose将Python后端从Gitkit迁移到FirebaseAuth以进行令牌验证

2024-05-14 16:55:49 发布

您现在位置:Python中文网/ 问答频道 /正文

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.

我无法验证令牌。在

这就是我所处的位置;为了开始迁移,我按如下步骤进行:

  1. 我将Firebase Auth添加到Android应用程序中,同时在Firebase Auth正常工作之前仍在应用程序中保留Gitkit。现在我有两个登录按钮,一个登录到Firebase,一个用于“几乎不推荐使用”的Gitkit。

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

现在我试图用^{}替换^{}库。由于我当前没有将Firebase令牌发送到后端,而只发送Gitkit令牌,所以我想在Gitkit令牌上测试这个python-jose库。在

在后端,在调用GitKit.VerifyGitkitToken()之前,我现在打印出jose.jwt.get_unverified_header()和{}的结果,以检查我是否能看到我期望的结果。结果很好,我可以像预期的那样查看Gitkit令牌的内容。在

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

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)

我如何利用我现有的信息做到这一点?我猜观众是声明中的“aud”字段,但我如何检查签名?在

一旦删除了服务器上的Gitkit依赖项,我将继续迁移。在

据我所见,GitKit库显然会向Google服务器发出“RPC”调用进行验证,但我可能错了。在

那么,哪一个是Gitkit令牌验证的密钥,也是Firebase令牌验证的密钥?在


Tags: andthe服务器tokennoneauth应用程序google
1条回答
网友
1楼 · 发布于 2024-05-14 16:55:49

可以获得钥匙

对于消防基地 https://www.googleapis.com/robot/v1/metadata/x509/securetoken@system.gserviceaccount.com

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

使用google^{}库使验证变得非常容易。在

但是如果您想使用^{}而不是oauth2client,那么you first need to convert the PEM certificate into an RSA public key更新:这个问题得到了修复,对于Firebase,这现在由库处理,向下滚动到这个注释前面的GitHub链接的末尾。不确定Gitkit)。这个公钥就是需要使用的密钥。并且访问群体应该从JWT头中提取而不是,而是硬编码到源代码中,在Firebase中,访问群体是项目id,在Gitkit中,它是OAuth 2.0客户端id之一,可以在Google开发人员控制台凭证部分找到。在

JWT头中的kid用于选择适当的证书,该证书将用于获取用于执行验证的密钥。在

  # 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)

相关问题 更多 >

    热门问题