Google Ads API 認証の流れ

本稿ではGoogle Ads APIを利用するにあたり認証を通すまでの手順を記載します。
もちろん、手順は公式のドキュメントにも存在しますが、イメージキャプチャ踏まえ理解しやすくまとめられればと思います。

# Google Ads API とは

[公式ドキュメント](https://developers.google.com/google-ads/api/docs/start?hl=ja)

Google Ads API は AdWords API の次世代バージョンで、[Google 広告]
(https://ads.google.com/intl/ja_jp/getstarted/)の最新のプログラマティック インターフェース。デベロッパーは Google 広告プラットフォームを直接操作できるため、Google 広告の大規模で複雑なアカウントやキャンペーンを効率的に管理できる（抜粋）。

つまり、Google Ads API を用いて Google 広告 のサービスや機能へアクセスをすることができ、レポート数値などの管理を行うことが可能となります。

また、Google Ads API を利用するには下記に記載の手段があり、利用シーンにより最適な手段を選択できるようになっています。

* JSON REST エンドポイント
* [gRPCインターフェース](https://grpc.io/)
* [クライアントライブラリ](https://developers.google.com/google-ads/api/docs/client-libs?hl=ja)

この記事では、上述した手段を利用できるようにするための認証方法を記載します。

# 認証を通してAPIを呼び出す

[公式ドキュメント](https://developers.google.com/google-ads/api/docs/first-call/overview?hl=ja)

基本はドキュメントに記載のクイックスタートにある手順に沿って進めていきます。

## 1. 開発者トークンの発行

開発者トークンとは、ドキュメントにも記載がありますが、特定のアカウントではなく、ご利用のプロジェクトに対してAPIへのアクセスを許可するものです。

実際に開発者トークンを発行するまでの流れを見てみましょう。

### 1-1. クライアントセンター（MCC）アカウントにログイン

クライアントセンター（MCC）アカウントについての詳細は下記をご確認ください。
[Google 広告のクライアント センター（MCC）アカウントについて](https://support.google.com/google-ads/answer/6139186?hl=ja)

ログイン後の画面はこのようになります。
![概要_テストアカウント_Google_広告.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296574/e07fa589-3161-bb36-a26a-3a9c50bbc371.png)

※補足
この後実際にアクセス方法を記載しますが、事前に注意点を追記します。
この後の手順で説明しているアカウントは、全て本番用のアカウントでの設定となります。
ここでは開発者用のトークンを取得することがゴールとなります。
が、実際の開発時にAPIでアクセスを行う際、すでに開発者トークンが本番用に承認が通っていれば問題ないのですが、そうでない場合、テスト用アカウントをMCC上に作成した上でAPIを利用しなければなりません（承認が通っていないうちは、アクセス自体が拒否されてしまいます）。
MCC上でテストアカウントの作成を行うには下記のページを参考にしてください。

[テストアカウントについて](https://developers.google.com/adwords/api/docs/guides/accounts-overview?hl=ja#test_accounts)

※補足2
テストアカウント作成後、テストアカウントのクライアントIDを元にAPIをたたけるのですが、テストアカウント状態でキャンペーンの作成などができず、認証が正常に通っているか程度の確認しかできないです。
他にいい方法があれば追記します。


### 1-2. APIセンターにアクセス
MCCの「ツールと設定メニュー」からAPIセンターにアクセスを行うと開発者トークンが表示されます。
<img width="1680" alt="スクリーンショット 2020-05-20 10.58.15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296574/207c9340-11a8-20ba-3872-f788f9b942d2.png">

APIセンターのキャプチャ
![テストアカウント_Google_広告 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296574/a949e501-3e7c-5259-e24c-5d9e72414447.png)

秘匿情報のためぼかしていますが、赤枠で囲っている開発者トークンの右側にトークンが記載されていればOKです。
注意点としては、公式にも記載がありますがログイン時のアカウントが管理者でないとメニューが表示できないので、必ず管理者アカウントでログインするようにしてください。

## 2. クライアントライブラリを取得する

[公式ドキュメント](https://developers.google.com/google-ads/api/docs/first-call/get-client-lib?hl=ja)

前述でも述べたとおり、Google Ads API を実行する手段は複数あり、今回は認証からAPI実行までを確認するためクイックスタートのステップ通りクライアントライブラリを利用します。
クライアントライブラリはAPIの呼び出しから様々な機能を利用するためのオブジェクトを予めライブラリとしてまとめているもので、比較的導入がしやすいものとなっています。
また、言語サポートの選択肢も多いところが特徴です（サポート言語はドキュメントを確認）。

今回はPHPを利用します。
[github](https://github.com/googleads/google-ads-php/blob/master/README.md#getting-started)のREADMEにインストール方法やサンプルコードが記載されているので一読しておくと良いでしょう。

laravelなどのフレームワークを利用の際はcomposerにも対応しているので、下記のコマンドで取得することも可能です。

```
composer require googleads/google-ads-php
```

あるいは、composer.jsonに追記

```
"require": {
    "googleads/google-ads-php": "^3.2",
}
```

また、Google Ads API は gRPCが必要となるため、PHPのモジュールにgRPCがないときは事前にインストールが必要となります。
(インストール方法は後述)

## 3. Google Ads API に Google API Console プロジェクトを設定する

[公式ドキュメント](https://developers.google.com/google-ads/api/docs/first-call/oauth-cloud-project?hl=ja)

Google の OAuth2 サーバーにアクセスするための認証情報は、Google 広告ユーザーを認証したり承認したりするために必要です。これらの認証情報によりアプリケーションが識別され、Google 広告のユーザーを管理するための OAuth トークンが生成さます（抜粋）。

この章では、Google API Console からプロジェクトを作成し、認証を通すまでの準備を行ます。

### 3-1. プロジェクトを作成する

まず初めに、[Google Api Console](https://console.developers.google.com/project?hl=ja) へ移動しプロジェクトの作成を行ます。
![リソースの管理_–_Google_API_Console.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296574/b54c8ce7-3ae6-33af-580e-74579469bb10.png)
Google Api Console にログインするとこのような画面が表示されます。
赤枠で囲んだところからプロジェクトを作成を行ます。

プロジェクト作成画面
![新しいプロジェクト_–_Google_API_Console.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296574/f9aa8a6e-47ec-cb45-96d5-45eddd893473.png)

プロジェクトの作成が完了するとリスト画面に登録したプロジェクトが表示されます。
![リソースの管理_–_Google_API_Console (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296574/c3a90f6a-adb5-bc72-f31e-86a2c7c3e8c6.png)

### 3-2. プロジェクトで Google Ads API を有効にする

先ほど作成したプロジェクトで、利用できるAPIを選択し有効にする手順が必要となります。
左上のハンバーガーメニューから　APIとサービス > ダッシュボード　へ移動してください。

<img width="1680" alt="スクリーンショット 2020-05-20 12.16.33.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296574/88214e3d-e342-1be7-ebc1-7364fd6c840f.png">

移動すると作成したプロジェクトのダッシュボード画面に移動します。
もし、先ほど作成したプロジェクト以外が選択されていた場合、赤枠の箇所で他のプロジェクトに切り替えることが可能です。

ダッシュボードの画面から「+ APIとサービスの有効化」をクリックし移動します。
![API_とサービス_–_API_とサービス_–_test_api_–_Google_API_Console.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296574/5d528898-5c38-078d-bc34-f196cb5f2eba.png)

![API_ライブラリ_test_api_Google_API_コンソール.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296574/916089f4-fe5e-bfb5-007d-a35e1cc50cbc.png)

上記キャプチャの画面で、「Google Ads API」を検索し有効化を行ます。
![API_とサービス_test_api_Google_API_コンソール.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296574/ec13b2ce-9e06-5063-860f-22c195b80624.png)

![概要_–_API_とサービス_–_test_api_–_Google_API_Console.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296574/4f602397-0c16-9c18-d761-47bea1e9bd18.png)
これで有効化は完了です。

### 3-3. クライアント ID とクライアント シークレットを作成する
OAuth2 クライアント ID とクライアント シークレットを生成します。

#### 3-3-1. 認証情報ページを開く
[こちら](https://console.developers.google.com/apis/credentials?hl=ja)から認証情報ページを開きます。
![認証情報_–_API_とサービス_–_test_api_–_Google_API_Console.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296574/27af8186-e111-5ff3-c4f3-b6d5da76ff39.png)

#### 3-3-2. 認証情報を作成
画面上部の「+ 認証情報を作成」を押し、「OAuth クライアント ID」を選択します。
<img width="1680" alt="スクリーンショット 2020-05-20 14.21.01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296574/6b505bf6-1037-33cb-bdc5-2a9e7edc79f1.png">

同意画面のページでプロダクト名の設定を促された場合は、[同意画面を設定] をクリックして必要な情報を入力し、[保存] をクリックして認証情報ページに戻り、再度「+ 認証情報を作成」を押し、「OAuth クライアント ID」を選択し画面へ移動します。

#### 3-3-3. OAuth クライアント ID の作成
ここでやっとOAuth クライアント ID の作成に入ります。
作成する際にアプリケーションの種類を選択できますので、利用シーンに適したものを選択します。
![OAuth_クライアント_ID_の作成_–_API_とサービス_–_test_api_–_Google_API_Console.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296574/4d588643-87d9-09a6-c653-2b6fa35b98fc.png)

![OAuth_クライアント_ID_の作成_–_API_とサービス_–_test_api_–_Google_API_Console (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296574/c19db2e8-9faf-0bc5-7168-2d3ed8eba81b.png)
選択したアプリケーションの種類により入力項目が変わるので、必要事項を記入の上作成ボタンを押します。

#### 3-3-4. クライアントID とクライアント シークレットを取得
正常に作成が完了すると、クライアントIDとクライアントシークレットの情報が表示されます。
この2つはクライアントライブラリの設定に必要となるためクリップポードなどにコピーしておきます。

![認証情報_–_API_とサービス_–_test_api_–_Google_API_Console (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296574/d125c15a-0186-253b-7620-b1e6449ad3cd.png)

## 4. Google Ads API で OAuth 用のクライアントライブラリを設定

[公式ドキュメント](https://developers.google.com/google-ads/api/docs/first-call/oauth-client-library?hl=ja)

実際に設定したクライアントID、クライアントシークレットを利用してAPIにアクセスをするための認証とリフレッシュトークンを取得するまでをドキュメントに沿い実行してみます。

アプリケーションなどで利用する際、OAuth2アクセスは一定期間後に有効期限が切れるため、自動的に OAuth2 アクセスを更新するリフレッシュトークン（OAuth2 更新トークン）を取得します。

※認証を通すサンプルコードを実行しましたが、一部ドキュメントの記載と異なる部分があるためご容赦ください。

### 4-1. OAuth2 認証情報を使用してクライアント ライブラリをインストールする
まず、クライアントライブラリを選択します。
今回は言語PHPの[ウェブ アプリケーションのフロー](https://github.com/googleads/google-ads-php/wiki/OAuth-Web-Application-Flow)を参考に進めます。

リンク先には認証するためのフローが記載されているので、先にクライアントライブラリをインストールしましょう。

[インストールするクライアントライブラリ](https://github.com/googleads/google-ads-php)

```
$ git clone https://github.com/googleads/google-ads-php.git
$ cd google-ads-php
$ composer install
```
適当な場所で上記のコマンドを実行するだけで利用できます。

### 4-2. クライアントライブラリを利用して認証を通す
[ウェブアプリケーションのフロー](https://github.com/googleads/google-ads-php/wiki/OAuth-Web-Application-Flow)に記載のステップを実行していきます。

ステップ1で下記の注意書きがあります。

```
IMPORTANT: The example below requires that you register the following as one of the Authorized redirect URIs in your project:
http://localhost/oauth2callback
```

後ほど認証用のプログラムを実行するのですが、戻り値に認証を行うために遷移するURLが記載されています。
Google API Console で作成したOAuthクライアントIDの「承認済みのリダイレクト URI」に追加しておく必要があり、追加されていないと認証エラーとなってしまうので注意してください。

ステップ2でプログラムを実行します。
サンプルではAuthenticateInWebApplication.phpを実行しているので、これにのっとり実行していきます。

```
$ php examples/Authentication/AuthenticateInWebApplication.php
Enter your OAuth2 client ID here: [クライアントID]
Enter your OAuth2 client secret here: [クライアントシークレット]
Log into the Google account you use for Google Ads and visit the following URL in your web browser: 
https://accounts.google.com/o/oauth2/v2/auth?response_type=code&access_type=offline&client_id=xxx&redirect_uri=http%3A%2F%2Flocalhost%2Foauth2callback&state=xxx&scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fadwords
```
実行するとクライアントIDとクライアントシークレットの入力を求められるので、作成したものを入力してください。
最終的にURLが出力されるのでコピーしてご利用のブラウザで直接実行を行ます。
この時、ターミナルなどはそのままの状態にしておきましょう（認証が全て完了した後、リフレッシュトークンなどの情報が自動的に出力されます）。

試していた時に、結果のURLのパラメーターのredirect_urlの部分が `http://127.0.0.1:[ランダムなポート]/oauth2callback` となってしまい、ブラウザでの認証時にリダイレクト認証ページエラーが出てしまいました。
パラメーターの部分をlocalhostに変更するか、Google API Consoleの「承認ずみリダイレクトURI」に `http://127.0.0.1:[ランダムなポート]/oauth2callback` を登録することで回避できます。が、シンプルでないのでよくないですね。。

無事に認証が通ると下記のようにリフレッシュトークンが取得できるようになります。

```
$ php examples/Authentication/AuthenticateInWebApplication.php
Enter your OAuth2 client ID here: [クライアントID]
Enter your OAuth2 client secret here: [クライアントシークレット]
Log into the Google account you use for Google Ads and visit the following URL in your web browser: 
https://accounts.google.com/o/oauth2/v2/auth?response_type=code&access_type=offline&client_id=xxx&redirect_uri=http%3A%2F%2Flocalhost%2Foauth2callback&state=xxx&scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fadwords

Your refresh token is: [取得したリフレッシュトークン]
Copy the text below into a file named "google_ads_php.ini" in your home directory, and replace "INSERT_DEVELOPER_TOKEN_HERE" with your developer token:

[GOOGLE_ADS]
developerToken = "INSERT_DEVELOPER_TOKEN_HERE"
; Required for manager accounts only: Specify the login customer ID used to authenticate API calls.
; This will be the customer ID of the authenticated manager account. You can also specify this later
; in code if your application uses multiple manager account + OAuth pairs.
; loginCustomerId = "INSERT_LOGIN_CUSTOMER_ID_HERE"
[OAUTH2]
clientId = "[クライアントID]"
clientSecret = "[クライアントシークレット]"
refreshToken = "[取得したリフレッシュトークン]"
```

これでAPIをキックするための認証情報は取得完了となります。

# gRPC
APIを利用するためにはgRPCが必須となります。
メモ：詳細は追って追記


# まとめ
ドキュメントと現状とで乖離がある部分や、なかなかわかりにくい記載などがあるためとっつきにくいですが、参考になればと思います。
トークンの取り扱いやクライアントライブラリのフレームワークへの反映など、実際に本番で利用する際に気をつけなければいけないことがあると思うので、その辺りは別途まとめる予定です。