我正在维护一个网站及其移动应用程序(iOS 和 Android)。对于移动应用程序中的 Google 登录,我在服务器端使用google-auth Python 包。
从大约一个月前开始,我开始从服务器端收到与 Google 登录相关的错误报告。错误消息如下所示:
未找到密钥 ID 728f4016652079b9ed99861bb09bafc5a45baa86 的证书。
服务器端 Google 登录身份验证后端遵循此文档:
from google.oauth2 import id_token
from google.auth.transport import requests
# ...
try:
# The following line may raise ValueError with message:
# Certificate for key id xxxx not found.
id_info = id_token.verify_oauth2_token(google_id_token, requests.Request())
if id_info['aud'] not in VALID_CLIENT_IDS:
logger.error('Invalid aud from Google ID token: %s', id_info['aud'])
raise ValueError('Unverified audience.')
# ...
except ValueError as exc:
logger.error('Fail to verify Google ID token: %s', exc, extra={'request': request})
该错误来自google.auth.jwt 模块,在根据 Google 公共证书列表验证 Google 颁发的 JWT 时。
深入研究 google-auth 代码,我可以看到该verify_oauth2_token()
函数正在从 URL https://www.googleapis.com/oauth2/v1/certs获取 Google 公开证书。似乎有时,对于从某些 Android 手机发送的某些 Google ID 令牌,在该 URL 中找不到密钥 ID。
以下是一些可能有用的其他细节:
- iOS应用似乎没有这种问题。从
USER_AGENT
标题中,我可以看到该错误仅发生在 Android 应用程序 (USER_AGENT=okhttp/3.11.0
) 中。它只发生在某些 Android 设备中,而不是全部。 - 我想知道这是否只发生在中国的安卓手机上(例如,如果他们通过 VPN 连接)。所以我也检查了用户IP地址。但事实证明,其中一些用户来自欧洲。
- 服务器错误日志中一次又一次地重复出现某些密钥 ID。例如,
aa436c3f63b281ce0d976da0b51a34860ff960eb
从 11 月初到现在(12 月底),密钥 id 被看到了几十次。 - 我经常看到这个错误,每天几次(10~30次)。
我的网站在以下环境中运行:
- 操作系统:Linux (CentOS 7) 64 位
- Apache 2 与 mod_wsgi 4.5.24
- Python 3.6.7 和 Django 2.1.2
- google-auth 版本:尝试了 1.3.0 和 1.6.1
由于我无法用我的 iPhone 或我的 Android 手机(华为 P20,在法国购买)重现此问题,我完全被卡住了。
但是,我的一个朋友现在有这个问题,他从香港买了他的安卓手机。这让我想到,对于某些国家/地区,Google 登录是否有可能使用一些不同的证书,而不是https://www.googleapis.com/oauth2/v1/certs上的公共证书?
我不认为这是 google-auth 包中的错误。我想知道你们中是否有人听说过这个错误,并且可以给我一个关于它可能的原因的提示?
提前致谢!