我正在尝试访问并验证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 page来获取其非永久链接
{
"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对其进行解码和验证时,出现以下回溯和错误:
>>> decoded = jwt.decode(IDjwt, public_key, algorithms='RS256')
ValueError: Could not deserialize key data.
请记住,当我使用pyJWT的其他跳过验证的方法时,我仍然可以轻松地从id_token抓取标头/有效载荷(这意味着问题出在公共密钥上,而不是id_token)。所以我的主要问题是:如何在Python中解码/使用此Base64urlUInt编码的值?模量不够吗?此公钥的“ e”或指数值是AQAB,不确定是否重要。