我正在维护一个网站及其移动应用程序(iOS 和 Android)。对于移动应用程序中的 Google 登录,我正在使用google-auth Python 包 https://github.com/googleapis/google-auth-library-python在服务器端。
从大约一个月前开始,我开始从服务器端收到与Google登录相关的错误报告。错误消息如下所示:
找不到密钥 ID 728f4016652079b9ed99861bb09bafc5a45baa86 的证书。
服务器端 Google Sign-In 身份验证后端如下这个文件 https://developers.google.com/identity/sign-in/android/backend-auth:
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 模块 https://github.com/googleapis/google-auth-library-python/blob/master/google/auth/jwt.py#L226,根据 Google 公共证书列表验证 Google 颁发的 JWT 时。
深入研究 google-auth 代码 https://github.com/googleapis/google-auth-library-python/blob/master/google/oauth2/id_token.py#L139, 我理解了verify_oauth2_token()
函数正在从 URL 获取 Google 公共证书https://www.googleapis.com/oauth2/v1/certs https://www.googleapis.com/oauth2/v1/certs。有时,对于从某些 Android 手机发送的某些 Google ID 令牌,似乎无法在该 URL 中找到密钥 ID。
以下是一些可能有用的其他详细信息:
- iOS应用似乎没有这种问题。来自
USER_AGENT
标题,我可以看到错误仅发生在 Android 应用程序中(USER_AGENT=okhttp/3.11.0
)。而且这种情况仅发生在部分 Android 设备上,并非全部。
- 我想知道这种情况是否只发生在中国的 Android 手机上(例如,如果它们通过 VPN 连接)。所以我也检查了用户的IP地址。但事实证明,其中一些用户来自欧洲。
- 某些密钥 ID 在服务器错误日志中一次又一次重复出现。例如,密钥 ID
aa436c3f63b281ce0d976da0b51a34860ff960eb
从11月初到现在(12月底),出现了几十次。
- 我经常看到这个错误,每天好几次(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,在法国购买)重现此问题,所以我完全陷入困境。
但是,我的一个朋友现在遇到了这个问题,他从香港购买了 Android 手机。这让我想到,对于某些国家/地区,Google 登录是否可能使用除公共证书之外的一些不同证书https://www.googleapis.com/oauth2/v1/certs https://www.googleapis.com/oauth2/v1/certs?
我不认为这是 google-auth 包中的错误。我想知道你们中是否有人听说过这个错误,并且可以给我一些关于其可能原因的提示?
提前致谢!