使用 google auth 库验证 JWT

Posted

技术标签:

【中文标题】使用 google auth 库验证 JWT【英文标题】:Verify JWT using google auth library 【发布时间】:2019-09-13 05:08:54 【问题描述】:

我正在尝试验证 Google IAP 基于此 example 生成的 JWT。我正在使用 App Engine 和 Python 3.7,这意味着我不能使用与示例相同的库,因为它不会 work 与 App Engine 一起使用。

寻找替代方案我尝试使用google.auth,但它不适用于任何 JTW。我使用https://jwt.io::

中的工具创建了这个令牌作为示例
from google.auth import jwt
token = 'eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6IkxZeVAyZyJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWUsImlhdCI6MTUxNjIzOTAyMn0.OjJokSnHIdMxqTlpT055GJDe72-zoTZBE5NISmrDPx0dletHBTnlbl1wwr0EhWaxgKIesZ7N7eLd4XW-TgX-vA'
cert = '-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEEVs/o5+uQbTjL3chynL4wXgUg2R9\nq9UU8I5mEovUf86QZ7kOBIjJwqnzD1omageEHWwHdBO6B+dFabmdT9POxg==\n-----END PUBLIC KEY-----\n'
jwt.decode(token, certs=cert)

但出现以下错误:

/tests/jwt/google_auth/venv/lib/python3.5/site-packages/rsa/pem.py", line 92, in load_pem
    raise ValueError('No PEM start marker "%s" found' % pem_start)
ValueError: No PEM start marker "b'-----BEGIN RSA PUBLIC KEY-----'" found

这让我想知道为什么 jwt 模块无法解码使用 EC256 算法创建的令牌,因为这是 Google IAP 使用的算法。

所以有人知道为什么会这样吗? 你能推荐一个替代品吗?

注意:在寻找其他替代方案时,我还找到了ecdsa python 实现,但我不允许使用这个(安全团队不允许这个)。

【问题讨论】:

【参考方案1】:

你需要从key之前删除这部分-----BEGIN RSA PUBLIC KEY----------END PUBLIC KEY-----

【讨论】:

我认为弄乱公钥并不是一个好主意,无论哪种方式都需要标记来确定使用哪种类型的密钥 您不需要更改密钥本身。您只需从密钥副本中删除此部分【参考方案2】:

显然,使用 ES256 和 google auth 验证 JWT 是不可能的:https://github.com/googleapis/google-auth-library-python/issues/336#issuecomment-486748042

因此,如果有人尝试使用应用引擎执行此操作,您唯一的选择是: https://github.com/warner/python-ecdsa

【讨论】:

以上是关于使用 google auth 库验证 JWT的主要内容,如果未能解决你的问题,请参考以下文章

Auth0 - 验证 JWT

Django + Auth0 JWT 身份验证拒绝解码

使用 JWT PHP 库导致“签名验证失败”的网站的 Google 登录

使用 Google Auth 时对 Django Rest Framework 进行身份验证

Laravel Tymon\JWT Auth:在身份验证之前检查未完成的有效令牌?

Spring boot + JWT 实现安全验证 ---auth0.jwt