Web サイトとそのモバイル アプリ (iOS および Android) を管理しています。モバイル アプリでの Google サインインの場合、サーバー側でgoogle-auth Python パッケージを使用しています。
1か月ほど前から、サーバー側から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 が発行した JWT を Google の公開証明書のリストに対して検証するときに、google.auth.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 デバイスでのみ発生します。 - これは中国の Android スマートフォンでのみ発生するのでしょうか (VPN 経由で接続している場合など)。そのため、ユーザーの IP アドレスも確認しました。しかし、それらのユーザーの一部はヨーロッパから来たことが判明しました。
- 一部のキー ID がサーバー エラー ログで何度も繰り返されています。たとえば、キー ID
aa436c3f63b281ce0d976da0b51a34860ff960eb
は、11 月の初めから現在 (12 月末) まで、何十回も見られます。 - 毎日数回(10〜30回)、このエラーが常に表示されます。
私のウェブサイトは次の環境で実行されています。
- OS: Linux (CentOS 7) 64 ビット
- mod_wsgi 4.5.24 を使用する Apache 2
- Python 3.6.7 および Django 2.1.2
- google-auth バージョン: 1.3.0 と 1.6.1 の両方を試しました
iPhone でも Android フォン (フランスで購入した Huawei P20) でもこの問題を再現できなかったため、完全に行き詰まりました。
しかし、私の友人の 1 人が現在この問題を抱えており、彼は香港から Android フォンを購入しました。これにより、一部の国では、Google サインインがhttps://www.googleapis.com/oauth2/v1/certsの公開証明書以外のいくつかの異なる証明書を使用する可能性があると思いますか?
これは google-auth パッケージのバグではないと思います。このエラーについて聞いたことがある人がいるかどうか疑問に思っています。考えられる原因についてのヒントを教えてください。
前もって感謝します!