Rubyを使用してCognito UserPoolにユーザを登録する

AWSのAmazon CognitoでUserPoolsを使う例って、モバイルやJavascriptを用いたものはよく出ているけど、
例えばRubyでやる場合とかどうすりゃええねん！と思いつつ、なかなか例が出ていなかったのでやってみた。
その記録。

# UserPoolsの設定

Step by stepで書くのは面倒だったので、結果だけ貼っておきます。

![UserPools設定](https://qiita-image-store.s3.amazonaws.com/0/19870/e4968f41-e69e-1678-1a03-9040e1c4f26f.png)

特に、Appsの部分の「CognitoSampleApp」は、「Generate client secret」のチェックを外しました。

![Appsの作成](https://qiita-image-store.s3.amazonaws.com/0/19870/d3ec59a5-edd2-44a4-0a85-d3f700a82fcc.png)

# Cognito操作のためIAMユーザを作成

このあとAWS SDKを使用したCognito操作のため、IAMユーザを作成します。
なお、このユーザには「AmazonCognitoPowerUser」ポリシーを割り当てます。


# Rubyを利用してユーザ登録

## はじめに

AWS SDK for Ruby (Version 2)を用いて、実際に登録してみた。
お試しということで、irbを使ってざくっとやってみた。

```irb
irb(main):001:0> require 'aws-sdk-core'
=> true
```

設定に関してはYAMLファイルを用意しておいた。
内容的には、前述で用意したユーザのACCESS KEY情報(access_key_id, secret_access_key)、Cognitoのリージョン(region)、設定したアプリケーションのクライアントID(client_id)など。

Cognitoで設定したアプリケーションのクライアントID(client_id)は、Appsの設定を参照してください。（黒塗で消した部分）

![client_idの確認](https://qiita-image-store.s3.amazonaws.com/0/19870/6f0ed0bd-1f11-33e1-03a2-bf5a334ccb72.png)

irbでは以下のように読み込みます。

```irb
irb(main):002:0> require 'yaml'
=> true
irb(main):003:0> props = YAML.load(File.read('./credentials.yml'))
=> {"region"=>"us-east-1", "access_key_id"=>"ACCESS_KEY", "secret_access_key"=>"SECRET_ACCESS_KEY", "client_id"=>"xxxxxxxxxxxxxxxxxxxxxxxxxx"}
```

## Sign up（ユーザ登録）

CognitoIdentityProviderのClientを作成します。

```irb
irb(main):004:0> client = Aws::CognitoIdentityProvider::Client.new(
irb(main):005:1*     region:            props['region'],
irb(main):006:1*     access_key_id:     props['access_key_id'],
irb(main):007:1*     secret_access_key: props['secret_access_key'],
irb(main):008:1* )
=> #<Aws::CognitoIdentityProvider::Client>
```

Sign upでユーザを作ります。
この時、``username``はUserPoolの設定でattributeとは異なるものなので注意。
attributeで選択したものは「``user_attributes``」にkey-valueの形式で指定していきます。

```irb
irb(main):009:0> resp = client.sign_up({
irb(main):010:2*     client_id: props['client_id'],
irb(main):011:2*     username:  "sampleuser",
irb(main):012:2*     password:  "SamplePassw0rd!",
irb(main):013:2*     user_attributes: [
irb(main):014:2*         {
irb(main):015:2*             name:  "email",
irb(main):016:2*             value: "sampleuser@example.com"
irb(main):017:2*         },
irb(main):018:2*         {
irb(main):019:2*             name:  "nickname",
irb(main):020:2*             value: "samplenickname"
irb(main):021:2*         }
irb(main):022:2*     ],
irb(main):023:2*     validation_data: [],
irb(main):024:2* })
=> #<struct Aws::CognitoIdentityProvider::Types::SignUpResponse user_confirmed=false, code_delivery_details=#<struct Aws::CognitoIdentityProvider::Types::CodeDeliveryDetailsType destination="s***@e***.com", delivery_medium="Email", attribute_name="email">>
```
この時点で、user_attributesのemailに指定したメールアドレスあてに下記のようなメールが届きます。

![verification.png](https://qiita-image-store.s3.amazonaws.com/0/19870/c4fde2b7-3771-1323-5bdf-f1de1705efac.png)

このメールに記載されているコードを用いて確認します。

## Sign up直後のUserPoolの状況

ここで一度UserPoolの内容を確認します。

![SignUp直後のUserPool](https://qiita-image-store.s3.amazonaws.com/0/19870/6a4c90bc-b54f-7847-a6bf-6f212a5a77d8.png)

上記のようにユーザが追加されていることがわかります。

さらにUsernameリンクをクリックすると、下記のような情報が参照できます。

![SignUp直後のUser](https://qiita-image-store.s3.amazonaws.com/0/19870/739c78f5-a0ee-d14b-8018-aefcdb5993ba.png)

「email_verified false」となっており、まだメールで通知された確認コードによる認証が済んでいない状態です。

## 確認コードを登録

メール通知された確認コード(confirmation_code）を使って、登録を完了します。

```irb
irb(main):025:0> resp = client.confirm_sign_up({
irb(main):026:2*     client_id: props['client_id'],
irb(main):027:2*     username:  "sampleuser",
irb(main):028:2*     confirmation_code: "706183",  #enter the verification code on email
irb(main):029:2*     force_alias_creation: false,
irb(main):030:2* })
=> #<struct Aws::CognitoIdentityProvider::Types::AddCustomAttributesResponse>
```
確認が完了しました。

## 確認コード登録完了直後のUserPoolの状況

UserPoolの内容を確認します。

![確認コード登録完了直後のUserPool](https://qiita-image-store.s3.amazonaws.com/0/19870/c767fad0-45d8-eb3c-df8c-cfefd4da0ac9.png)

StatusがConfirmedに変更されています。

さらにUsernameリンクをクリックし、詳細情報を参照します。

![確認コード登録完了直後のUser](https://qiita-image-store.s3.amazonaws.com/0/19870/5a19dcd5-e018-cf64-85b9-6afa9dcc493b.png)

「email_verified true」となっており、確認完了したことがわかります。