Amazon Cognito User Poolsの情報をサーバサイドで取得する

## 概要

ユーザ管理機能はどのようなWebサービスにおいても必須と言っていい重要な機能ですが、AWSのCognito User Poolsはそれをマネージドで提供してくれるありがたいサービスです。
登録されたユーザ情報をクライアントから取得する方法は下記の記事にて紹介されていますが、この記事ではサーバサイド(PHP)で取得する方法を紹介したいと思います。

[iOS]
[『[新機能] Amazon Cognito に待望のユーザー認証基盤「User Pools」が追加されました！』](http://dev.classmethod.jp/cloud/aws/cognito-user-pool/)

[Web(Javascript)]
[『Amazon Cognito User Poolsを使って、webサイトにユーザ認証基盤を作る』](http://qiita.com/horike37/items/1d522f66452d3abe1203)

## 利用ライブラリなど

* aws-sdk-php **バージョン3(重要)**
* Laravel 5.2

## 設定

下記コマンドにてcomposer.jsonにaws-sdk-php(v3)のパッケージ情報を追記、インストールします。

```
$ composer require aws/aws-sdk-php:3.*
$ composer update
```

Cognito User Pools自体の設定、テスト用のユーザ情報登録は概要で紹介した記事をご覧ください。

### ちょっとだけフォロー

[『Amazon Cognito User Poolsを使って、webサイトにユーザ認証基盤を作る』](http://qiita.com/horike37/items/1d522f66452d3abe1203)に掲載されているコードは必要最小限のため、実際に動くものを手に入れようとするといろいろ書き足す必要があります。
少なくともjQuery, aws-sdk, amazon-cognito-identity, aws-cognito-sdkのJavascriptライブラリが必要です。セットアップについて説明されているページへのリンクも合わせて紹介しておきます。
[aws/amazon-cognito-identity-js#setup](https://github.com/aws/amazon-cognito-identity-js#setup)

## コードサンプル

PHPからユーザ情報を取得するコードのサンプルを掲載します。フレームワークはLaravelですが、該当箇所にLaravel固有の記述はないはずです。

### Controller

```
<?php namespace App\Http\Controllers;

use Log;
use App\Http\Controllers\Controller;
use Aws\CognitoIdentityProvider\CognitoIdentityProviderClient;

class UsersController extends Controller {
    
    public function view() {
        $client = new CognitoIdentityProviderClient([
            'profile' => 'default',
            'region'  => '/* YOUR_USER_POOLS_REGION */',
            'version' => '2016-04-18'
        ]);
        $params = [
            'Username' => '/* USERNAME_TO_GET */',
            'UserPoolId' => '/* YOUR_USER_POOLS_ID */'
        ];
        $user = $client->adminGetUser($params);
        return view('user', compact('user'));
    }
}
```

### View

View側ではこのような感じで各属性を取得します。

```
$user->get('Username') // ユーザ情報を取得する際に指定した'Username'
```

[JMESPath](http://jmespath.org/)というのを使って情報を抽出するのが独特ですね。

```
$user->search('UserAttributes[?Name==`name`].Value')[0] // ユーザ属性のほうの'name'
```

一応配列なので、こんな感じで出力することも出来ますが、当然保守性は悪くなります。

```
$user->search('UserAttributes[0].Value') // 一番目の属性って？
```

## 取得されたデータ

ちなみに`$user`をそのまま出力するとこのようになります。

```
Model Data ---------- Data can be retrieved from the model object using the get() method of the model (e.g., `$result->get($key)`) or "accessing the result like an associative array (e.g. `$result['key']`). You can also execute JMESPath expressions on the result data using the search() method. 
{
    "@metadata": {
        "effectiveUri": "https://cognito-idp.us-east-1.amazonaws.com", 
        "headers": {
            "connection": "keep-alive", 
            "content-length": "461", 
            "content-type": "application/x-amz-json-1.1", 
            "date": "Sat, 09 Jul 2016 08:18:33 GMT", 
            "x-amzn-requestid": "***省略***"
        }, 
        "statusCode": 200, 
        "transferStats": {
            "http": [
                []
            ]
        }
    }, 
    "Enabled": true, 
    "UserAttributes": [
        {
            "Name": "address", 
            "Value": "***省略***"
        }, 
        {
            "Name": "email_verified", 
            "Value": "false"
        }, 
        {
            "Name": "name", 
            "Value": "***省略***"
        }, 
        {
            "Name": "email", 
            "Value": "***省略***"
        }
    ], 
    "UserCreateDate": "2016-07-05T05:32:20+00:00", 
    "UserLastModifiedDate": "2016-07-05T05:32:20+00:00", 
    "UserStatus": "UNCONFIRMED", 
    "Username": "***USERNAME_TO_GET***"
}
```

使い方まで出力してくれるのは親切ですね！

## 公式ドキュメント

もちろん、ユーザ情報取得以外のことも出来ます。
ほかにどのようなことが出来るかは公式ドキュメントでご確認下さい。

[AWS SDK for PHP 3.x - Class CognitoIdentityProviderClient](http://docs.aws.amazon.com/aws-sdk-php/v3/api/class-Aws.CognitoIdentityProvider.CognitoIdentityProviderClient.html)