首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将Python后端从Gitkit迁移到Firebase-Auth,使用python-jose进行令牌验证

将Python后端从Gitkit迁移到Firebase-Auth,使用python-jose进行令牌验证
EN

Stack Overflow用户
提问于 2016-08-24 12:38:15
回答 1查看 1K关注 0票数 2

在GitHub上一个有用的Google开发人员告诉我

要创建用户会话,python后端服务器只需要一个JWT库来验证请求中的Firebase Auth令牌(签名和受众),并从令牌有效负载中提取用户信息。

我在验证令牌方面有困难。

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

  1. 我在Android应用程序中添加了Firebase-Auth,直到Firebase使用为止,我仍然在应用程序中使用Gitkit。现在我有两个登录按钮,一个登录到Firebase,一个用于“几乎不推荐”的Gitkit。
  2. 在firebase.com上,我将Google导入到一个新的firebase.com中,因此用户数据库是相同的。我已经成功地使用了Firebase(安卓应用程序中的Auth),能够以已知用户的身份登录,并且我可以通过调用mFirebaseAuth.getCurrentUser().getToken(false).getResult().getToken()成功地检索我的后端服务器所需的令牌。它包含与GitKit令牌相同的GitKit。

现在,我正在尝试用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 Auth令牌(签名和观众)

我该如何处理我所拥有的信息?我猜观众是在声明中的'aud‘字段,但我如何检查签名?

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

据我所见,GitKit库显然对Google进行了"RPC“调用以进行验证,但我可能错了。

那么,哪个是Gitkit令牌验证的关键,也是Firebase令牌验证的关键?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-08-25 22:37:30

钥匙可以得到。

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

以及https://www.googleapis.com/identitytoolkit/v3/relyingparty/publicKeys的吉特基特

使用谷歌oauth2client库使验证变得非常容易。

但是如果您想使用python-jose而不是oauth2client,那么您首先需要将PEM证书转换为RSA公钥。 (update:这个问题解决了,对于Firebase,这个问题现在由库来处理,向下滚动到这个注释之前的GitHub链接的末尾。不确定吉特的事)。然后,这个公钥就是需要使用的密钥。受众应该从JWT头中提取而不是,而是硬编码到源代码中,其中Firebase中的受众是项目id,而在Gitkit中,它是OAuth 2.0客户端id之一,可以在Google凭据部分找到。

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

代码语言:javascript
复制
  # 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)
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39123568

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档