在GitHub上一个有用的Google开发人员告诉我
要创建用户会话,python后端服务器只需要一个JWT库来验证请求中的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令牌验证的关键?
发布于 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用于选择适当的证书,该证书将用于获取用于执行验证的密钥。
# 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)https://stackoverflow.com/questions/39123568
复制相似问题