Google Service Accountを使用したユーザー一覧取得 - [PHP]

# はじめに
Googleのサービスアカウントを使用してGoogle Apps使用ユーザーの一覧を取得する必要があり調べてもちょっと情報が古かったので備忘録

### 環境
- PHP

googleがphp向けにだしてるAPIクライアント使用 - このverが2.0になったので2.0を使用
https://github.com/google/google-api-php-client

## 前準備1
Google Developers Consoleからサービスアカウントの作成。
https://console.developers.google.com

1. 認証情報 > 認証情報を作成からサービスアカウントキーを選択
![スクリーンショット 2016-09-02 14.15.31.png](https://qiita-image-store.s3.amazonaws.com/0/138174/1a9e1a99-13f2-69ec-64f9-8ffb07448bca.png)

2. キー作成時にサービスアカウント名をサービス名として入力、役割を選択、キーのタイプをJSONを選択して作成
![スクリーンショット 2016-09-02 14.21.32.png](https://qiita-image-store.s3.amazonaws.com/0/138174/02f59179-71d3-013a-aacb-8c0f9a74a913.png)

3. 作成した「API Project-xxxxxxxxxxxx.jso」を「private_key.jsonへリネーム」

4. サービスアカウントキーのサービスアカウントの管理を選択
![スクリーンショット 2016-09-02 14.31.38.png](https://qiita-image-store.s3.amazonaws.com/0/138174/ed321930-800d-4677-d0f0-847870be64da.png)

5. 先ほど作成したサービスアカウントを選んで編集を選択
![スクリーンショット 2016-09-02 14.32.11.png](https://qiita-image-store.s3.amazonaws.com/0/138174/fba153cb-6edd-8644-ee46-1683263fd25b.png)

6. Google Appsのドメイン全体の委任を有効にするにチェックを入れて保存
![スクリーンショット 2016-09-02 14.32.22.png](https://qiita-image-store.s3.amazonaws.com/0/138174/3357c415-b005-c7e3-566c-daaa5daf7ebc.png)

7. クライアントIDを表示を選択
![スクリーンショット 2016-09-02 14.32.45.png](https://qiita-image-store.s3.amazonaws.com/0/138174/a13b1709-2aff-d73f-4321-2d2696993237.png)

8. 表示されているクライアントIDをメモ
![スクリーンショット 2016-09-02 14.32.52.png](https://qiita-image-store.s3.amazonaws.com/0/138174/fce77bb1-49fd-2aa9-e903-cca1e5cb0af5.png)

## 前準備2
Google AppsのAdmin consoleからサービスアカウントへ権限を付与する。
http://admin.google.com/

1. セキュリティを選択
2. もっと見る > 詳細設定 > API クライアント アクセスを管理するを選択
3. 前準備1でメモっておいたクライアントIDをクライアント名へ記載、APIの範囲に必要なスコープをカンマ区切りで記載し承認。今回はとりあえず下記を追加詳しくは→https://developers.google.com/admin-sdk/directory/v1/guides/authorizing
    - https://www.googleapis.com/auth/admin.directory.user
    - https://www.googleapis.com/auth/admin.directory.user.readonly

![スクリーンショット 2016-09-02 14.44.39.png](https://qiita-image-store.s3.amazonaws.com/0/138174/7994bb89-94fc-ba50-27a6-ebfda5364a7f.png)
4. セキュリティに戻ってAPIリファレンスのAPI アクセスを有効にするにチェックを入れて保存 

ここまでで使用準備完了！

## Composer使用
```composer init```
---省略---
```composer require google/apiclient```
private_keyを作成したディレクトリへ移動

## user取得
```:google.php
<?php
require_once 'vendor/autoload.php';

// 証明書情報のセット
putenv('GOOGLE_APPLICATION_CREDENTIALS=private_key.json');

$client = new Google_Client();
// サービス名の設定：多分なんでもいい
$client->setApplicationName("hogehoge-service");
// デフォルト証明書使用（GOOGLE_APPLICATION_CREDENTIALS）セットしたい場合はsetAuthConfigで証明書パスを指定
$client->useApplicationDefaultCredentials();
// 使用するスコープを指定
$client->setScopes([Google_Service_Directory::ADMIN_DIRECTORY_USER_READONLY]);
// 権限を持ったユーザーのメールアドレス指定
$client->setSubject('xxxxxxx@xxxxxxxxx.co.jp');

// サービスAPI名指定
$service = new Google_Service_Directory($client);

// 取得する際のオプション指定
$options = ['domain' => 'xxxxxxxx.co.jp','maxResults' => 500,'orderBy' => 'email'];

$results = $service->users->listUsers($options);
var_dump($results);

```

# まとめ
事前設定がややこしいので面倒臭いがコード自体はかなりシンプルになっており、使い易い印象スコープの指定や権限周りについては必要最低限にしておかないとすべてのユーザーに対してなんでもできてしまうので注意が必要

# 参考
https://github.com/google/google-api-php-client
https://developers.google.com/api-client-library/php/
https://developers.google.com/admin-sdk/directory/v1/guides/authorizing