Cognito実装してみた―自分用サンプル付き

## Cognitoの準備

下記参考サイトを参考に設定を行った。

https://qiita.com/rihib/items/e5bbd522c96925102dba


## ユーザープールの作成

:::note info
基本的に赤枠を設定していきます
:::

まずは、ユーザープールを作成していきます。
ユーザープールの詳細などについては、ほかのサイトが詳しく説明しているので、省略します。

![スクリーンショット 2024-06-04 205258.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125890/8497288e-b906-c60d-9aed-a4f6150a8bd2.png)

今回は、Emailで設定を行いますが、ユーザー名や電話番号でも認証が可能なようです。
ユーザーに自由にサインアップさせない場合は、ユーザー名で設定するのが良いかもしれません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125890/1f079e01-0cab-1a3c-e4a2-f605caceb583.png)

パスワードのセキュリティに関しては、基本的にデフォルトでよいでしょう。
最強クラスや要件が決まっている場合は、カスタムを利用しましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125890/b0b08c86-fc0d-0ba9-cca2-1422a3edc229.png)

多要素認証も対応しているようです。
今回に関しては、サインインには、MFAを利用しないためオフに設定します。また、MFAに関する設定に関しては情報が少ないため、実装するには少し根気が必要かもしれません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125890/a22cd32f-a23b-8e83-3ee8-0853887f8168.png)

ここはデフォルトでよいでしょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125890/5b7830b8-4594-b63f-07bd-c69aa45051ca.png)

今回は、Congnitoの持つEメールの機能を利用してメールアドレスの確認を行います。
月の送信制限などがあるとのことなので、本番環境には利用せずに簡単に確かめるために利用しましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125890/1342c63a-ddc6-268a-4b01-b91c96634adc.png)

自由にわかりやすい名前を付けましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125890/da31be05-25d5-090c-09ad-9138a6ea49aa.png)

アプリケーションクライエントを作成できます。
基本的にはパブリッククライアントを利用することで、SPAなどは対応が可能なようです。
シークレットクライアントに関しては、サーバーサイドに秘密情報を持つことで、よりセキュアにできるようです。主に公開するAPIなどで利用するっぽいですが、詳細は不明です、、、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125890/b4f4d977-b83c-0941-6c31-6bd68fc21115.png)

今回利用するサンプルが、この２つを利用するため認証フローで有効にしておいてください。

:::note warn
SRPのほうは利用しないように変更したため、削除して大丈夫です。
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125890/4180ecec-2f55-f823-9ff1-7a8125715925.png)

最後にこれまで設定した内容を確認して終了です。

## 必要なID情報を取得する
ここの対応するユーザープールIPを取得してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125890/707bcbda-84b9-dbcf-38b3-b7ec0b1f67a0.png)

ユーザープール　＞　アプリケーションの統合　に進みます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125890/8fd50ae3-5721-8ea1-cf3d-b5beae63df34.png)

下の方に行くと、アプリケーションクライエントとあるので、該当するIDを取得するようにしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125890/a3215054-ec5e-260b-aecb-51604febf063.png)

## Next.jsサンプルプロジェクト

ソースはこちらにあります。

https://github.com/koinunopochi/cognito/tree/main/sample_next

nextで最低限サインアップ、サインイン、サインアウト、バックエンドAPIの認証を済ませたアプリとなっています。

config_sample.jsonのある階層で、`config.json`を作成し、`config.json`に先ほどコピーした内容を張り付けるようにしてください。

後は、developerモードで立ち上げることで、最低限で動作するNextアプリが立ち上がります。
挙動を見ながら参考にしていただければ幸いです。

## 公式のReactサンプル

https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/javascriptv3/example_code/cognito-identity-provider/scenarios/cognito-developer-guide-react-example/frontend-client

こちらに、Reactのサンプルがあります。こちらも参考にしながら動かしてみると挙動を理解しやすいと思います。

## Vue.js サンプル

https://github.com/koinunopochi/cognito/tree/main/saple_vue_express_spa

Nextのものを流用することで作成しました。
Vue　＋　cognitoなどで調べると出てくる、`amazon-cognito-identity-js`で行おうとすると、周辺の依存関係がうまく解決できませんでした。

また、`Amplify`に関する情報が多く出てくるのですが、すでにあるユーザープールで利用が難しいようにも感じたので、今回はNextで利用したライブラリを利用しています。なので、基本的に同じコードを利用可能です。

:::note warn
フロントエンドに認証情報をバーンと置いているような感じになっているので、利用する場合は適宜修正してください。
:::


## まとめ

ID関係が多く、IDの場所を探すのに苦労した。
しかし、一方で実装は簡単であるため、とても良いサービスだと感じた。

~~普段はVueを利用しているので、サンプルを作成しておきたい、、、~~
⇒簡単なものを作成した

## 追記

AmplifyでSRPをうまく作れなかったため、

https://qiita.com/faable01/items/ceb7678d5e00917eb0c9

もしSRPを利用する場合にAmplifyが動作しない場合は上の記事を参考に修正していく。