認証情報の管理戦略

API リクエスト間で認証情報を共有すると、パフォーマンスが向上し、レート制限エラーの原因となる過剰なオーバーヘッドを回避できます。このガイドでは、アプリで Google Ads API と効率的にやり取りできるように、OAuth2 認証情報の管理を最適化する方法を説明します。

認証情報の共有戦略は、アプリがマルチスレッド形式マルチプロセス(または分散)かによって異なります。各プロセス内でマルチプロセスとマルチスレッドの両方の機能を備えたアプリでは、両方の戦略を採用する必要があります。これらの戦略は、複数の Google 広告アカウントに適用することもできます。

マルチスレッド

スレッドによって描画される各セッションまたはユーザーは、同じ認証情報オブジェクトを使用する必要があります。また、競合状態を回避するため、アクセス トークンの更新は同期的に行う必要があります。

Google のクライアント ライブラリにより、認証情報は、アクセス トークンの有効期限が切れたときに同期的に更新されるスレッドセーフなオブジェクトであることが保証されます。各クライアント ライブラリには、存続期間を通じて再利用される認証情報を持つセッション(またはユーザー)オブジェクトがあります。スレッド間で認証情報を共有するには、同じ認証情報を使用して各セッションを構築するだけです。たとえば Java クライアント ライブラリでは、Credential シングルトンを作成してすべてのセッションで共有します。

マルチプロセスまたは分散型

マルチプロセスまたは分散プロセスの場合は、共有する前に認証情報を永続化する必要があります。複数のプロセスまたはサーバーが認証情報を同時に更新しようとして過剰な更新リクエストが発生しないようにするには、更新を 1 つのプロセスに割り当てる必要があります。

たとえば、別のジョブやサービスが認証情報を定期的に更新し、サーバーのプールで共有されるデータストアに事前に push できます。これにより、各サーバーは API リクエストを行うときにデータストアから認証情報を取得できます。

更新ジョブ

更新ジョブでは、現在の認証情報が期限切れになるまで待ってから更新を開始しないでください。これを行うと、有効な認証情報がないためにアプリが停止する可能性があります。ただし、API リクエストの処理中に認証情報のアクセス トークンが期限切れになった場合、リクエストは引き続き完了し、結果が返されます。

アクセス トークンが最後に更新された時刻を記録し、有効期限まで 5 分未満の場合は強制的に更新することをおすすめします。

アクセス トークンが最後にいつ更新されたかわからない場合は、すでに期限切れになっていると仮定して更新を試みることができます。アクセス トークンが期限切れに近づいていない場合、サーバーは同じアクセス トークンと、トークンの有効期限が切れるまでの残りミリ秒を返します。

データストア

既存のデータストアを利用しても、サーバー間での認証情報の共有専用のデータストアを配置しても構いません。ソリューションには、MemcachedInfinispan などのキャッシュ サーバーや、MongoDB などの NoSQL データストアが含まれます。

書き込みリクエストよりも読み取りリクエストの方が多いため、データストアは、高速読み取りオペレーション向けに最適化する必要があります。また、認証情報は安全に保存する必要があります。

認証情報を保存するときは、計算された expiry_time(現在 + expires_in)と refresh_tokenaccess_token とともに保存する必要があります。expiry_time は、access_token 更新リクエストの時刻に expires_in 時刻を足した時刻として計算されます。

サーバープール

プール内の各サーバーまたはプロセスは、リクエストを行う前にデータストアから最新の認証情報を取得します。更新ジョブが適切に実行されている限り、認証情報は有効です。ただし、更新ジョブまたはデータストアが失敗した場合は、フォールバック メカニズムが必要です。

サーバーまたはプロセスがデータストアから認証情報を取得できなかった場合や、認証情報の有効期限が切れた場合は、問題が解決するまでアプリケーションと API の接続が途切れないように、サーバーが自身の認証情報を更新する必要があります。

複数アカウントの認証情報管理

Google 広告 MCC アカウント用に生成された認証情報を使用すると、すべての子アカウントにアクセスできます。したがって、ユーザーの階層が 1 つの MCC アカウントの場合、通常は、最上位の MCC アカウントの認証情報を生成すれば、その MCC アカウントの下位にあるすべての Google 広告アカウントで使用できます。

MCC アカウントの階層で互いに関連付けられていない Google 広告アカウントにアプリからアクセスする必要がある場合は、アクセスする Google 広告クライアント アカウントや、アクセスする独立した階層の最上位の MCC アカウントなど、アカウントごとに異なる認証情報を生成して維持する必要があります。

マルチスレッド アプリまたはマルチプロセス / 分散アプリについても、少し変更して同じ方法を使用できます。共有データストアを使用する場合は、認証情報をアカウント ID customerId でインデックスに登録して、認証情報が正しいアカウントに関連付けられるようにする必要があります。また、更新ジョブでは、すべての認証情報を更新しておく必要があります。新しいアカウントがリンクされている場合は、更新ジョブのトリガーが必要になることがあります。

最後に、マルチスレッド アプリでは、認証情報オブジェクトが関連付けられているアカウントで動作しているスレッド間でのみ、認証情報オブジェクトを共有する必要があります。