CognitoでOpenID Connect（Yahoo! ID連携）

## Cognitoとは
<img width="718" alt="スクリーンショット 2018-04-13 10.12.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/142489/53162891-a106-74fb-583c-d4949731bfec.png">

※引用元：https://aws.amazon.com/jp/cognito

公式によるとこのような感じだそうです。
簡単に言うと「認証基盤を受け持ってくれるAWSのサービス」みたいな感じでしょうか。

詳細はクラスメソッドさんの記事に整理されているのでご覧ください。
[Amazon Cognito と仲良くなるために歴史と機能を整理したし、 Cognito User Pools と API Gateway の連携も試した ｜ Developers.IO](https://dev.classmethod.jp/server-side/serverless/amazon-cognito-api-gateway-idtoken/)

## なぜOpenID Connect
OpenID Connectについてはこの素晴らしい記事をご覧ください。
[一番分かりやすい OpenID Connect の説明 - Qiita](https://qiita.com/TakahikoKawasaki/items/498ca08bbfcc341691fe)

複数サービスを提供している企業がID共通基盤を構築しようとした時、既存ユーザーを抱えたままサービスを超えてお互いに認証したり、解析用に名寄せするにはこの選択が最良と考えました。（結果はまだわからない）

## Yahoo! ID連携 v2
ひとまず自社のプロダクトをプロバイダーにする前にすでに公開されているプロバイダーでCognitoにログインしてみましょう。

こちらの記事を参考にさせていただきながら、Yahoo! ID連携 v2でCognitoにログインしてみました。
[OpenID Connect体験 - Qiita](https://qiita.com/sonedazaurus/items/753a65186f1be7185b39)

## アプリケーションの登録
[アプリケーションの管理：Yahoo!デベロッパーネットワーク](https://e.developer.yahoo.co.jp/register)
<img width="962" alt="スクリーンショット_2018-04-13_10_46_30.png" src="https://qiita-image-store.s3.amazonaws.com/0/142489/446b25eb-8b1e-ab58-69b3-9d7cb6a40d95.png">


アプリケーション名などを入力して、登録します。

<img width="499" alt="スクリーンショット_2018-04-13_10_49_39.png" src="https://qiita-image-store.s3.amazonaws.com/0/142489/ac331d48-d9fc-9525-5f29-03a643f73da4.png">

登録するとClient IDとシークレットが発行されます。
※認証するだけであればシークレットは必要ありません。

## AWS Cognitoへ登録
CognitoでOpenID Connectを使う際には、IAMにIDプロバイダーとして登録する必要があります。

<img width="574" alt="スクリーンショット_2018-04-13_11_09_23.png" src="https://qiita-image-store.s3.amazonaws.com/0/142489/5af692ed-a011-fe8f-81f6-d5c9eb1034d5.png">
プロバイダーのURLに```https://auth.login.yahoo.co.jp/yconnect/v2```
対象者にアプリケーション登録時に発行されたClient IDを入力します。

<img width="607" alt="スクリーンショット_2018-04-13_11_25_34.png" src="https://qiita-image-store.s3.amazonaws.com/0/142489/46a3f0ea-7059-6e14-f087-6c9f389ef9f6.png">

登録されるとCognitoのOpenIDの項目にプロバイダーが追加されます。

## ID Tokenを取得する
以下のURLをブラウザに打ち込みます。
client_idやredirect_uriは自分の環境に書き換えてください。
stateとnonceは不正アクセス対策としてサービス実装時には処理が必要ですが、今回は接続テストなので適当な値を入れました。
```https://auth.login.yahoo.co.jp/yconnect/v2/authorization?response_type=code+id_token&client_id=【CLIENT_ID】&redirect_uri=http://localhost:8080&state=aaaa&scope=openid+profile&nonce=aaaa```

<img width="519" alt="スクリーンショット 2018-04-13 11.45.37.png" src="https://qiita-image-store.s3.amazonaws.com/0/142489/748afdce-0406-c3dd-50e6-17e4984ee561.png">
こんな画面が出れば成功です。同意するとredirect_uriにリダイレクトされます。


<img width="676" alt="スクリーンショット_2018-04-13_13_29_43.png" src="https://qiita-image-store.s3.amazonaws.com/0/142489/c276f3a2-8115-9b86-f66f-3b2f5b8136cf.png">

リダイレクトされた際にGETパラメータにid_token=hogehogehogeがついてくるので、このid_tokenを使ってCognitoにアクセスしてみます。

## ログインしてみる
id_tokenが取れたので、いよいよCognitoにアクセスしてみようと思います。
今回はJavaScriptでやってみました。

```
# sdk install
install aws-sdk --save
```

```
AWS.config.region = "ap-northeast-1";
AWS.config.credentials = new AWS.CognitoIdentityCredentials({
  IdentityPoolId: "【IDENTITY_POOL_ID】",
  Logins: {
    'auth.login.yahoo.co.jp/yconnect/v2' : '【ID_TOKEN】'
  }
});

AWS.config.credentials.get(function(err) {
  console.log("Cognito Identify Id: " + AWS.config.credentials.identityId);
});
```
<img width="537" alt="スクリーンショット_2018-04-13_13_38_55.png" src="https://qiita-image-store.s3.amazonaws.com/0/142489/fe36f5f5-c615-2c66-a674-4d8b78aa36d7.png">

無事identityIdが払い出されて、ログインできました。

## 参考にさせていただきました
- [OpenID Connect体験 - Qiita](https://qiita.com/sonedazaurus/items/753a65186f1be7185b39)
- [一番分かりやすい OpenID Connect の説明 - Qiita](https://qiita.com/TakahikoKawasaki/items/498ca08bbfcc341691fe)
- [Amazon Cognito と仲良くなるために歴史と機能を整理したし、 Cognito User Pools と API Gateway の連携も試した ｜ Developers.IO](https://dev.classmethod.jp/server-side/serverless/amazon-cognito-api-gateway-idtoken/)