Cognito認証からドメイン取得（1.Cognito編）

##課題
AWSを使って認証機能を作っちゃおうということで

+ Amazon S3
+ Amazon Lambda
+ Amazon Cognito
+ Amazon DynamoDB
+ Amazon API Gateway

の4つを利用し、それぞれ連携させたドメイン認証機能の作成が目標となります

↓DBに予め準備されたメールアドレスが登録しようとすると「Lambda」、「DynamoDB」を通り許可されます。
![Screenshot 2018-11-12 at 16.39.24.png](https://qiita-image-store.s3.amazonaws.com/0/308124/d684b005-0ef8-910c-584c-a54eebbee2be.png)
↓先ほど登録されたものをDB内から参照しログインさせます。
![Screenshot 2018-11-12 at 16.38.22.png](https://qiita-image-store.s3.amazonaws.com/0/308124/d8dd5fdf-513c-e052-7a09-39bb45d5b8ad.png)

↓コールバック先には「<b>https://</b>」形式しか設定できないためS3内にあるhtmlを参照する場合は「Routo53」と「Cloudfront」でhttps化をする必要があります。
ですが、今回はその２つを使わず「APIGateway」によるhttps化を行っていきます。
![Screenshot 2018-11-12 at 16.39.29.png](https://qiita-image-store.s3.amazonaws.com/0/308124/fc96c8ee-7370-a285-8bc2-fbe4723c7b70.png)

今回はCognitoだけで認証を行う手順を書きます

##Amazon Cognito
今回の課題の大黒柱となるのがAmazon Cognitoです。
Amazonが提供する認証機能の一つです。
環境の準備が必要ないため簡単に利用できます。
所謂「<b>ログイン処理</b>」を行ってくれる機能。
↓画面を自動で生成し認証（ログイン）を行い、目的の画面に行くことを許可するというもの。
![Screenshot 2018-11-05 at 17.04.43 - Display 2.png](https://qiita-image-store.s3.amazonaws.com/0/308124/16db696f-2970-7439-c83a-440ea28192a5.png)
ログインには

+ emailアドレス
+ パスワード

または

+ Googleアカウント

が必要になります。

今回はGoogleアカウントとの連携を行うことを想定した設計のため画像の様に連携した場合の手順を紹介します。


##目次
基本通りに作成しているわけではないので項目が飛ぶことがあります。
####Cognito設定手順
1.Cognito
2.ユーザープールの作成
3.プール名
4.属性
5.ポリシー
6.アプリクライアント
7.確認
8.プールの作成完了後
9.アプリクライアントの設定
10.ドメイン名
11.動作確認
12.サインアップ・ログイン

####Google連携手順

1.Google Cloud Platform
2.認証情報
3.OAuth同意画面
4.認証情報の作成
5.Cognito
6.IDプロバイダー
7.属性マッピング
8.アプリクライアントの再設定
9.Google連携の確認

###Cognito設定手順
####<b>1.Cognito</b>
AWSコンソールから「<b>Cognito</b>」を選択します。
今回はリージョンを「<b>アジアパシフィック（東京）</b>」にします。

####<b>2.ユーザープールの作成</b>
「<b>Cognito</b>」のトップ画面で「<b>ユーザープール管理</b>」を選択します。
管理画面で「<b>ユーザープールの作成</b>」を選択します。

####<b>3.プール名</b>
ここは任意の名前で大丈夫ですが、今回は「sample-pool」と名前をつけて進めます。
「<b>ステップに従って設定する</b>」を選択。

![Screenshot 2018-11-07 at 14.40.32 - Display 2.png](https://qiita-image-store.s3.amazonaws.com/0/308124/d91ae6e0-c704-b710-58b4-779e8519cc4d.png)


####<b>4.属性</b>
「エンドユーザーのサインイン方法」は後からの変更は<b>不可</b>であるため変更したい場合はユーザープールの削除してからの再作成になるため注意が必要です。
今回は「<b>Eメールアドレスおよび電話番号</b>」にチェックを入れたあとに「<b>Eメールアドレスを許可</b>」にもチェックを入れ次のステップに進みます。
![Screenshot 2018-11-07 at 14.39.10 - Display 2.png](https://qiita-image-store.s3.amazonaws.com/0/308124/08a60ac1-d4b5-429c-6e82-6375ee6983fb.png)

####<b>5.ポリシー</b>
ここではパスワード強度等のユーザーに対する設定が行えます。
セキュリティ上で不安なら設定を変更すると良いです。
今回はデフォルト設定で進めます。
![Screenshot 2018-11-07 at 14.39.22 - Display 2.png](https://qiita-image-store.s3.amazonaws.com/0/308124/742c7052-cd74-5d04-a0e1-acc1bb253660.png)

####<b>6.アプリクライアント</b>
項目が飛びます
このCognitoを利用するためのIDを発行する工程です。
「<b>アプリクライアントを追加</b>」を選択し、「<b>アプリクライアント名</b>」を入力します。
ここの名前も任意ですが、今回は「<b>sample</b>」としておきます。
「<b>クライアントシークレットを生成</b>」のチェックは外しておいてください
![Screenshot 2018-11-07 at 14.41.01 - Display 2.png](https://qiita-image-store.s3.amazonaws.com/0/308124/b78e4b26-4076-09cf-553c-8fbeb3ff7173.png)

####<b>7.確認</b>
「<b>プールの作成</b>」でプールの作成を行います。
属性の設定が間違っていると手順通りに行えなくなるので確認してください。
![Screenshot 2018-11-07 at 16.57.05 - Display 2.png](https://qiita-image-store.s3.amazonaws.com/0/308124/beeaa9f0-bbd4-5347-633b-c9f54baa00e4.png)

####<b>8.プール作成完了後</b>
「<b>全般設定</b>」から「<b>プールID</b>」を確認し、メモしておきます。
続いて「<b>アプリクライアント</b>」の項目から「<b>アプリクライアントID</b>」を確認しメモしておきます。

####<b>9.アプリクライアントの設定</b>
ここは簡単に言うと「ログインページ」を作る場所です。
「<b>有効なIDプロバイダ</b>」の「Cognito User Pool」にチェックをいれます。
「<b>コールバックURL</b>」には任意のコールバック先URLを入力しますが今回は「<b>https://www.amazon.com</b>」と入れておきましょう。
「<b>OAuthフロー</b>」には「<b>Authorization code grant</b>」「<b>Implicit grant</b>」にチェックを入れます。
※コールバックURL及びサインアウトURLには「<b>https://</b>」形式しか設定できないため注意が必要です。
S3内にあるhtmlを参照したい場合別の方法が必要になります。
「<b>OAuthスコープ</b>」には<b>全て</b>にチェックを入れます。
最後に変更の保存を行います。
![Screenshot 2018-11-07 at 15.40.32 - Display 2.png](https://qiita-image-store.s3.amazonaws.com/0/308124/38e39e0c-c132-8cf3-1149-2a530b3c915c.png)

####<b>10.ドメイン名</b>
ここではドメインを作成します。
すでに存在するドメインは使用できないので使用できそうなドメインを自分で決めます。
使用可能かのチェックを行ってドメイン名が使えるかの確認を行ってください。
私はとりあえず「uhohoi」にしておきます。
変更の保存をします。ついでに作成したドメインをメモっておきます。
私の場合は[https://uhohoi.auth.ap-northeast-1.amazoncognito.com](https://uhohoi.auth.ap-northeast-1.amazoncognito.com)ですね。
![Screenshot 2018-11-07 at 16.06.35 - Display 2.png](https://qiita-image-store.s3.amazonaws.com/0/308124/e613c0b9-173f-ebca-0a0c-3d70e06eac0a.png)

####<b>11.Cognitoの動作確認</b>
下記のURLのそれぞれ対応する箇所にメモした「ドメイン」「アプリクライアントID」「コールバックURL」を入れていきます。
<b>『Cognitoドメイン』/login?response_type=token&client_id=『アプリクライアントID』&redirect_uri=『コールバックURL』</b>

↓みたいな感じにします
https://uhohoi.auth.ap-northeast-1.amazoncognito.com/login?response_type=token&client_id=uhohoi2525uhyohyohyo252523&redirect_uri=https://www.amazon.com

出来上がったURLをアドレスバーに打ち込んでみます。
↓の画面が出ましたら成功です。やったね
![Screenshot 2018-11-07 at 17.05.39 - Display 2.png](https://qiita-image-store.s3.amazonaws.com/0/308124/6e592f8f-72a1-8af5-d9ba-5377a4c0105a.png)

####<b>12.サインアップ・ログイン</b>
ユーザー登録はまだされていないので「<b>Signup</b>」でメールアドレスとパスワードを入力します。
その後認証コードが送られてくるので、そのまま打ち込むとログインができます。
（今回の場合はAmazonのトップ画面が表示されればOKです）

これで第一段階は終わりです。

##Googleアカウントとの連携手順
####1.<b>Google Cloud Platform</b>
Google（アカウントが無い場合は作る必要があります）
https://console.cloud.google.com
※新しくアカウントを作った、またはプロジェクトがない場合は任意の名前で「<b>プロジェクトの作成</b>」を行ってください。

####2.<b>認証情報</b>
「<b>ナビゲーションメニュー</b>」の「<b>APIとサービス</b>」から「<b>認証情報</b>」を選択します。
![Screenshot 2018-11-07 at 17.28.07 - Display 2.png](https://qiita-image-store.s3.amazonaws.com/0/308124/65ead189-3f67-2b60-35de-ea38739eb031.png)

####3.OAuth同意画面
「<b>承認済みドメイン</b>」に「<b>amazoncognito.com</b>」を入力します。
ここではAmazon Cognitoのドメインの承認を行っています。
そのすぐ下にある「<b>[アプリケーション ホームページ] リンク</b>」に先程作成した「<b>『Cognitoドメイン』/login?response_type=token&client_id=『アプリクライアントID』&redirect_uri=『コールバックURL』</b>」を入力し、保存をします。

####4.<b>認証情報の作成</b>
「<b>認証情報を作成</b>」を押します。
タブが開かれるので「<b>OAuthクライアントID</b>」を選択します。
「<b>アプリケーションの種類</b>」は「<b>ウェブアプリケーション</b>」を選択します
「<b>名前</b>」は任意（cognito-sample等）
「<b>認証済みのリダイレクトURI</b>」には「<b>https://＜ドメイン名＞.auth.ap-northeast-1.amazoncognito.com/oauth2/idpresponse</b>」を入力し、保存します。
（私の場合、ドメイン名は「uhohoi」になります。）
![Screenshot 2018-11-07 at 18.06.41 - Display 2.png](https://qiita-image-store.s3.amazonaws.com/0/308124/3fa6cb85-2ac4-49fa-2ea0-c2671cc893eb.png)

保存が完了すると「<b>クライアントID</b>」と「<b>クライアントシークレット</b>」が発行されます、メモしておきましょう。

####5.Cognito
「<b>Cognito</b>」トップ画面で「<b>ユーザープールの管理</b>」を選択すると先程作った「<b>sample-pool</b>」が表示されるので開きます。

####6.<b>IDプロバイダー</b>
項目の中に「facebook」「SAML」等いくつかありますが今回は「<b>Google</b>」を選択します。
先程メモした2つをそれぞれ入力します
「<b>クライアントID</b>」→「<b>GoogleアプリID</b>」
「<b>クライアントシークレット</b>」→「<b>アプリシークレット</b>」

「<b>承認スコープ</b>」には「<b>profile email openid</b>」を入力しておきます。
その後、「<b>Googleの有効化</b>」をします。

####7.<b>属性マッピング</b>
この項目ではGoogle連携に必要な情報の入力をします。
「<b>Google</b>」タブを選択します。
「<b>email</b>」にチェックを入れ、右側のプルダウンで「<b>Email</b>」を選択します。
一番下の空欄にチェックを入れ「<b>sub</b>」と入力、右側のプルダウンで「<b>Username</b>」を選択します。
入力ができたら保存します。
![Screenshot 2018-11-07 at 18.28.08 - Display 2.png](https://qiita-image-store.s3.amazonaws.com/0/308124/d7ec0f01-0ae5-8888-71a3-7056a684f6d4.png)

####8.<b>アプリクライアントの設定</b>
忘れてはいけないのがこの項目の再設定です。
cognitoを設定していたときは「<b>Cognito User Pool</b>」のチェック欄のみでしたが、Google連携の設定を行ったことで「<b>Google</b>」のチェック欄も追加されているのでチェックを入れておきます。
ここを有効化しておかないとGoogleとの連携は行えないので忘れずに。
最後に保存をしたら完了です。
![Screenshot 2018-11-08 at 09.06.20.png](https://qiita-image-store.s3.amazonaws.com/0/308124/7d73d448-95f1-fc7f-0d16-21e5ceae4a8f.png)

####9.Google連携の確認
もう定番になっている
<b>『Cognitoドメイン』/login?response_type=token&client_id=『アプリクライアントID』&redirect_uri=『コールバックURL』</b>
をアドレスバーに打ち込みます。

↓この様に表示できれば大丈夫です。やったね。
![Screenshot 2018-11-05 at 17.04.43 - Display 2.png](https://qiita-image-store.s3.amazonaws.com/0/308124/cd98d3e8-08e3-7d10-afd9-8026806524fa.png)

「Continue with Google」を押してGoogleでのログイン後、アマゾンのホームページに入れれば成功です。

これで一通りの手順は終わりです！お疲れ様でした！

##まとめ
一通りやってみましたが複雑な設定が無いため簡単にできます。
最大のメリットはhtmlを作ったり、認証処理をさせるコード、ユーザー情報を入れておくサーバーが必要ないということ。コーディングが苦手な私でもあっという間に認証画面を作れました！
しかし今回私が作ったCognito単体かつhtmlを記載する形式だとセキュリティ上で非常に脆いのでお薦めできません。管理者だけしかユーザーを追加できない、DBの参照を行って認証をするなどしっかりと対策を組むことが理想です。

今回はemailでの認証で作りましたが、ユーザー名や電話番号などでの設定も可能です。
「UIのカスタマイズ」を行えば認証画面を変えることもできます。

次回は「<b>トリガー</b>」を利用した「<b>Lambda関数</b>」の呼び出しについての内容を書きます。

ありがとうございました。