シングル ユーザー認証のワークフロー

サービス アカウントのワークフローと同様に、単一ユーザー認証フローでは、Google 広告 UI が提供する認可機能とユーザー管理機能を使用して、アプリに必要なすべてのアカウントへのアクセス権を付与します。この認証ワークフローには、次の 2 つのステップがあります。

  • アプリで管理する必要があるすべての Google 広告アカウントへのアクセス権を 1 人のユーザーに付与します。
  • ユーザーは、アプリがユーザーに代わって Google 広告アカウントを管理することを承認し、アプリにすべての Google 広告アカウントへのアクセス権を付与します。

関与するユーザーは 1 人だけであるため、独自の OAuth 2.0 ユーザー認証フローを構築する代わりに、gcloud CLI や GenerateUserCredential コードサンプルなどのツールを使用できます。

このワークフローの関連するユースケースは、少数のユーザー ログイン(3 ~ 4 人のユーザーなど)でアカウントにアクセスできる場合です。この場合、gcloud CLI などのコマンドライン ツールを使用して 3 ~ 4 人のユーザーの認可を取得する労力と比較すると、本格的な OAuth マルチユーザー認証ワークフローを構築する開発作業は正当化されません。

デメリット

サービス アカウントのワークフローと比較すると、このフローにはいくつかのデメリットがあります。

  • ユーザー認証ワークフローでは、Google API Console で OAuth 2.0 クライアント ID とシークレットを作成する必要があります。これには、サービス アカウントとキーを作成するよりも多くの構成手順が必要です。
  • 承認済みユーザーがチームまたは会社を退職した場合、アカウントからユーザーを削除するか、ユーザー アカウントを無効にすると、アプリが動作しなくなることがあります。サービス アカウントは個々のユーザーに関連付けられていないため、このリスクは回避されます。
  • マルウェアやフィッシングによるアカウントの不正使用を防ぐため、Google 広告アカウントを承認するユーザーは、OAuth 2.0 更新トークンを生成するときにパスキーで認証する必要があります。サービス アカウントはパスキーを必要とせず、フィッシングなどのユーザーを対象とした標的型攻撃に対して脆弱ではありません。

認証情報を生成する

  1. アプリケーションの OAuth 同意画面を構成し、https://www.googleapis.com/auth/adwords を OAuth 2.0 スコープとして追加します。詳細については、OAuth 同意画面の設定をご覧ください。

  2. 手順に沿って、クライアント ID とクライアント シークレットを作成します。OAuth 2.0 クライアントを作成したら、確認ダイアログの [JSON をダウンロード] ボタンをクリックして、クライアントの JSON ファイルをダウンロードします。ファイルを credentials.json として保存します。

  3. アプリを使用して管理するすべての Google 広告アカウントにアクセスできるユーザー アカウントを特定します。アクセス権のないアカウントがある場合は、そのユーザーにアカウントへのアクセス権を付与します。このユーザー アカウントでパスキーが設定されていることを確認します(新しく作成したパスキーが信頼されるまでに、セキュリティ上の理由による 7 日間の待機期間が適用される場合があります)。

  4. gcloud CLI をダウンロードしてインストールします。インストールしたら、コマンドライン プロンプトから gcloud version コマンドを実行して、ツールが正しく動作することを確認します。出力は次のようになります。

    gcloud version
    Google Cloud SDK 492.0.0
    alpha 2024.09.06
    beta 2024.09.06
    bq 2.1.8
    bundled-python3-unix 3.11.9
    core 2024.09.06
    enterprise-certificate-proxy 0.3.2
    gcloud-crc32c 1.0.0
    
  5. 前の手順の credentials.json ファイルを使用して gcloud CLI ツールを実行し、OAuth 2.0 更新トークンを生成します。--client-id-file パラメータを渡す必要があります。これにより、更新トークンは、gcloud CLI のデフォルト プロジェクトではなく、Google API Console プロジェクトで発行されます。

    gcloud auth application-default login \
      --scopes=https://www.googleapis.com/auth/adwords,https://www.googleapis.com/auth/cloud-platform \
      --client-id-file=PATH_TO_CREDENTIALS_JSON
  6. gcloud コマンドを実行すると、新しいブラウザ ウィンドウで Google アカウントのログイン ウィンドウが開き、OAuth 2.0 認証の手順が表示されます。前の手順で選択したユーザーとしてログインし、パスキーを使用して本人確認を行います。アプリが未確認の場合、警告画面が表示されることがあります。このような場合は、[詳細設定] リンクをクリックし、[PROJECT_NAME に移動(安全でない)] オプションをクリックしても問題ありません。

  7. スコープを確認したら、[続行] ボタンをクリックして権限を付与します。ブラウザが https://cloud.google.com/sdk/auth_success に移動し、認証が成功したことを示します。ページに次のメッセージが表示されます。

    Authorization code granted. Close this tab.

    gcloud コマンドにより、次のメッセージが出力されます。

    Credentials saved to file: [/****/.config/gcloud/application_default_credentials.json]
    

    application_default_credentials.json ファイルを開きます。内容は次のようになります。

    {
      "account": "",
      "client_id": "******.apps.googleusercontent.com",
      "client_secret": "******",
      "refresh_token": "******",
      "type": "authorized_user",
      "universe_domain": "googleapis.com"
    }
    

クライアント ライブラリの構成

クライアント ライブラリの構成手順については、プログラミング言語に対応するタブを選択してください。承認済みユーザーが Google 広告クライアント センター(MCC)アカウントを介してクライアント アカウントにアクセスする場合は、login-customer-id(または loginCustomerId)に、その MCC アカウントの 10 桁のお客様 ID をハイフンなしで設定します。

Java

ads.properties ファイルで次のキーを構成します。

api.googleads.clientId=INSERT_OAUTH2_CLIENT_ID_HERE
api.googleads.clientSecret=INSERT_OAUTH2_CLIENT_SECRET_HERE
api.googleads.refreshToken=INSERT_OAUTH2_REFRESH_TOKEN_HERE
api.googleads.loginCustomerId=INSERT_LOGIN_CUSTOMER_ID_HERE

その他のオプションについては、構成ガイドをご覧ください。

.NET

GoogleAdsConfig インスタンスに OAuth 2.0 認証情報を設定し、それを使用して GoogleAdsClient オブジェクトを初期化します。

GoogleAdsConfig config = new GoogleAdsConfig()
{
    OAuth2Mode = OAuth2Flow.APPLICATION,
    OAuth2ClientId = "INSERT_OAUTH2_CLIENT_ID_HERE",
    OAuth2ClientSecret = "INSERT_OAUTH2_CLIENT_SECRET_HERE",
    OAuth2RefreshToken = "INSERT_OAUTH2_REFRESH_TOKEN_HERE",
    LoginCustomerId = "INSERT_LOGIN_CUSTOMER_ID_HERE",
};
GoogleAdsClient client = new GoogleAdsClient(config);

その他のオプションについては、構成ガイドをご覧ください。

Python

google-ads.yaml ファイルで次のキーを構成します。

client_id: INSERT_OAUTH2_CLIENT_ID_HERE
client_secret: INSERT_OAUTH2_CLIENT_SECRET_HERE
refresh_token: INSERT_OAUTH2_REFRESH_TOKEN_HERE
login_customer_id: INSERT_LOGIN_CUSTOMER_ID_HERE
use_proto_plus: True

その他のオプションについては、構成ガイドをご覧ください。

PHP

google_ads_php.ini ファイルで次のキーを構成します。

[GOOGLE_ADS]
loginCustomerId = "INSERT_LOGIN_CUSTOMER_ID_HERE"

[OAUTH2]
clientId = "INSERT_OAUTH2_CLIENT_ID_HERE"
clientSecret = "INSERT_OAUTH2_CLIENT_SECRET_HERE"
refreshToken = "INSERT_OAUTH2_REFRESH_TOKEN_HERE"

その他のオプションについては、構成ガイドをご覧ください。

Ruby

google_ads_config.rb ファイルで次のキーを構成します。

Google::Ads::GoogleAds::Config.new do |c|
  c.client_id = 'INSERT_OAUTH2_CLIENT_ID_HERE'
  c.client_secret = 'INSERT_OAUTH2_CLIENT_SECRET_HERE'
  c.refresh_token = 'INSERT_OAUTH2_REFRESH_TOKEN_HERE'
  c.login_customer_id = 'INSERT_LOGIN_CUSTOMER_ID_HERE'
end

その他のオプションについては、構成ガイドをご覧ください。

Perl

googleads.properties ファイルで次のキーを構成します。

clientId=INSERT_OAUTH2_CLIENT_ID_HERE
clientSecret=INSERT_OAUTH2_CLIENT_SECRET_HERE
refreshToken=INSERT_OAUTH2_REFRESH_TOKEN_HERE
loginCustomerId=INSERT_LOGIN_CUSTOMER_ID_HERE

その他のオプションについては、構成ガイドをご覧ください。

curl

まず、HTTP クライアントを使用して OAuth 2.0 アクセス トークンを取得します。このガイドでは、curl コマンドを使用します。

curl \
  --data "grant_type=refresh_token" \
  --data "client_id=CLIENT_ID" \
  --data "client_secret=CLIENT_SECRET" \
  --data "refresh_token=REFRESH_TOKEN" \
  https://oauth2.googleapis.com/token

API 呼び出しでアクセス トークンを使用できます。次の例は、GoogleAdsService.SearchStream メソッドを使用してキャンペーン レポートを実行し、アカウント内のキャンペーンを取得する方法を示しています。このガイドでは、レポートの詳細については説明しません。

curl -i -X POST \
  https://googleads.googleapis.com/v26/customers/CUSTOMER_ID/googleAds:searchStream \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer ACCESS_TOKEN" \
  -H "login-customer-id: LOGIN_CUSTOMER_ID" \
  --data-binary "@query.json"

query.json の内容は次のとおりです。

{
  "query": "SELECT campaign.id, campaign.name, campaign.network_settings.target_content_network FROM campaign ORDER BY campaign.id"
}