Over on GitHub一个有帮助的谷歌开发人员告诉我
要创建用户会话,python后端服务器只需要JWT
用于验证中的Firebase身份验证令牌(签名和访问群体)的库
请求并从令牌负载中提取用户信息。
我无法验证令牌。
我就在这里;为了开始迁移,我进行了如下操作:
我在Android应用程序中添加了Firebase Auth,但在Firebase Auth工作之前,程序中仍有Gitkit。现在我有两个登录按钮,一个登录到Firebase,另一个是“几乎不推荐”的Gitkit。
在firebase.com上,我将Google项目导入了一个新的firebase项目,因此用户数据库是相同的。我已经成功地在Android应用程序中使用了Firebase Auth,能够以已知用户的身份登录,并且可以通过调用mFirebaseAuth.getCurrentUser().getToken(false).getResult().getToken()成功地检索后端服务器所需的令牌。它包含与GitKit令牌相同的user_id
现在我试图用identity-toolkit-python-client替换python-jose库。因为我目前没有将Firebase令牌发送到后端,而是只发送Gitkit令牌,所以我想在Gitkit令牌上测试这个python-jose库。
在后端,在调用GitKit.VerifyGitkitToken()之前,我现在打印出jose.jwt.get_unverified_header()jose.jwt.get_unverified_claims()的结果,以便检查我是否能看到我期望的结果。结果很好,我可以像预期的那样查看Gitkit令牌的内容。
我的问题在于核实。我无法使用jose.jwt.decode()进行验证,因为我不知道需要使用哪个密钥。
jose.jwt.decode(token, key, algorithms=None, options=None, audience=None, issuer=None, subject=None, access_token=None)
我知道头中的算法,“aud”字段也存储在声明中,如果有帮助的话。
回到工程师的意见
验证Firebase身份验证令牌(签名和访问群体)
我如何利用现有的信息做到这一点?我猜观众是索赔中的“aud”字段,但我如何检查签名?
一旦删除了服务器上的Gitkit依赖项,我将继续迁移。
据我所见,GitKit库显然向Google服务器发出了一个“RPC”调用以进行验证,但我可能错了。
那么,哪个将是Gitkit令牌验证的密钥,哪个将是Firebase令牌验证的密钥?

最佳答案

钥匙可以拿到
对于位于的Firebase
https://www.googleapis.com/robot/v1/metadata/x509/[email protected]
对于Gitkit来说
https://www.googleapis.com/identitytoolkit/v3/relyingparty/publicKeys
使用Googlesoauth2client库使验证变得非常容易。
但是如果你想使用python-jose而不是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/[email protected]'

  # 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 - 使用Gitkit将Python后端从Gitkit迁移到Firebase-Auth,以进行 token 验证,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39123568/

10-10 23:26