Migrating Python backend from Gitkit to to Firebase-Auth with python-jose for token verification
在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.
我在验证令牌时遇到麻烦。
我在这里为了开始迁移,我进行了如下操作:
我将Firebase-Auth添加到Android应用程序中,同时在Firebase-Auth工作之前,该应用程序中仍包含Gitkit。现在,我有两个登录按钮,一个用于登录Firebase,另一个用于"几乎已弃用"的Gitkit。
在firebase.com上,我将Google项目导入到新的Firebase项目中,因此用户数据库相同。我已经设法在Android App中使用Firebase-Auth,能够以已知用户身份登录,并且可以通过调用
现在,我尝试用
在后端,在调用
我的问题来自验证。我无法使用
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令牌验证的关键?
可以获取密钥
用于Firebase
对于Gitkit
使用Googles
但是,如果要使用
JWT标头中的
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | # 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) |