python - 使用 PyJWT 解码和验证 Base64urlUInt 编码的 Google 公钥
问题描述
我正在尝试访问并验证 Google 的 OAuth API 响应的 id_token 属性:
{
"access_token": <Access Code Here>,
"token_type": "Bearer",
"expires_in": 3600,
"id_token": <id_token here>
}
获得我的 id_token 值后,我从他们的OpenIDConnect URI中获取 google 的公钥,可以从他们的openid-config 页面获得非永久链接
{
"kty": "RSA",
"alg": "RS256",
"use": "sig",
"kid": "8c9eb968f73744eaed421e48010142bce51a067f",
"n": "uweJ3hFY9wqZ6ZG-iSNhQwHtKCGl8G_jcQgGPjOrS-Rum3dyDjicqkAyfS8XDn480KD_TZ5m-lqBjqfimePu2_cH4URDPIwsqSzJI2_piEhaqnXRptIe5YB5imAL6iETKaOPjw284Fc7EdHK-ekHMn3AXjsy9AIErwAVw4-4ZXXwHbyQXJy1DyUB4ZzxiEvw_qkQmLdltmrNkLOw-Xh-C9UkTZ9NA58bYPBnxLwnAu_ggw_g_-hCAs6OvXZbAfFHhIGBLyjtdDLVrfXo1112QREB9d5sEds0bKZtJcD9afl4E7Ht6G-g3jNP2clAu6-6B-cIe4-j8Ph1uJDPkAmDfw",
"e": "AQAB"
},
根据 Google & Specification RFC 7518,“n”参数是“模数”,一个 Base64urlUInt 编码的值。因此,当我尝试使用 pyJWT 对其进行解码和验证时,我得到以下 Traceback & Error:
>>> decoded = jwt.decode(IDjwt, public_key, algorithms='RS256')
ValueError: Could not deserialize key data.
请记住,当我使用 pyJWT 的其他跳过验证的方法时,我仍然可以轻松地从 id_token 中获取标头/有效负载(这意味着问题在于公钥,而不是 id_token)。所以我的主要问题是:如何在 Python 中解码/使用这个 Base64urlUInt 编码的值?模数还不够吗?此公钥的“e”或指数值是 AQAB,不确定这是否重要。
解决方案
推荐阅读
- c++ - 如何在 C++11 中优雅地解决模棱两可的声明?
- javascript - 云功能未运行 - React Native
- python - 数据文件 - 使用 python 重构文件数据
- c# - 无法解决“未找到应用程序依赖项清单中指定的程序集”错误
- mysql - MySql 执行超时
- javascript - 开玩笑模拟 aws-sdk ReferenceError:在初始化之前无法访问
- python - 在熊猫中计算方形数据框的最有效方法
- cadence-workflow - 时间工作流程与节奏工作流程
- confluence-rest-api - 使用 Confluence API 使用 IFrame 宏创建页面
- excel - Excel 按钮打开 VBA 屏幕而不是运行代码