/ #React #AWS 

【React】Amplify CLI で Cognito を使った認証画面を実装する

もくじ

React + amplify cli でログイン認証させてみます ❗

前提

  • AWS CLI が導入済み
  • Node.js が導入済み

では 作っていきましょう 👻

APP を新規に作成します

この辺はコマンドだけでさらっと流します。

詳細はこのあたりを参考にしてください

$ npx create-react-app react-amplify-cognito
# react-amplify-cognito はApp名なのでお好みの名前で❗

# カレントディレクトリ移動
$ cd react-amplify-cognito

Amplify CLI をインストールする

下記のコマンドで(グローバルに)インストールします。

詳細はこのあたりを御覧ください

# インストール
$ npm install -g @aws-amplify/cli

# 念の為ターミナル再起動
$ exec $SHELL -l'

Amplify を初期化する

下記のコマンドで初期化します

$ amplify init

# 以下対話

# プロジェクト名は?と問われたので、何もせずEnter❗
? Enter a name for the project (reactamplifycognito)

# 設定がずらずらでたあとに、これで良い?と確認してくるので、何もせずEnter❗
? Initialize the project with the above configuration? (Y/n)

# 認証方法を聞かれるので、プロファイルを選択する
? Select the authentication method you want to use: (Use arrow keys)
❯ AWS profile
  AWS access keys

# 設定済みのプロファイル一覧がでてくるので、そこから対応のプロファイルを選ぶ。
# →だいたいの人はデフォルトでいいと思うけれども、複数プロファイル作っている人は注意❗
? Please choose the profile you want to use (Use arrow keys)
❯ default

# しばらく待つと下記な表示が出て、初期化が完了する
Your project has been successfully initialized and connected to the cloud!

AWS の Amplify のコンソールに行くと初期化された App を確認することができる。

Cognito による認証機能の追加

下記のコマンドで App に認証のリソースを追加します

$ amplify add auth

# 以下対話

# どれ使う?と問われるのでデフォルトを選択します
Do you want to use the default authentication and security configuration? (Use arrow keys)
❯ Default configuration
  Default configuration with Social Provider (Federation)
  Manual configuration
  I want to learn more.

# ログインするときにどれ使う?と問われるので、今回はユーザー名でいきます
How do you want users to be able to sign in? (Use arrow keys)
❯ Username
  Email
  Phone Number
  Email or Phone Number
  I want to learn more.

# 詳細設定刷る?と問われるので今回は No で❗
Do you want to configure advanced settings? (Use arrow keys)
❯ No, I am done.
  Yes, I want to make some additional changes.

# 下記が表示されてリソースの追加完了
Successfully added auth resource reactamplifycognito511115a7 locally

リソースをデプロイする

下記のコマンドでデプロイします

$ amplify push

# 下記デプロイするよーと言ってくるので、Enter
✔ Successfully pulled backend environment dev from the cloud.

Current Environment: dev

| Category | Resource name               | Operation | Provider plugin   |
| -------- | --------------------------- | --------- | ----------------- |
| Auth     | reactamplifycognito511115a7 | Create    | awscloudformation |
? Are you sure you want to continue? (Y/n)

完了後,cognito のコンソールでユーザープールを確認すると下記のように追加されいます

さて、これでインフラは揃いましたので、client 側にログイン画面を仕込んでいきます

Amplify Librar をインストールします

これは Amplify 向けの SDK で、下記のコマンドでインストールします。

$ npm install aws-amplify @aws-amplify/ui-react

ログイン画面を仕込む

一旦下記コマンドでアプリを実行します

$ npm run start

http://localhost:3000/

React の初期ページ(Edit src/App.js and save to reload.)が表示されることを確認します。

このページを、ログインしないと見れないように加工してみます。

src/App.jsを開いて下記のように加工します。

手を加えた行にコメントを残しました!といっても 6 行です(笑)

import logo from "./logo.svg";
import "./App.css";
import Amplify from "aws-amplify"; // 追加
import { withAuthenticator, AmplifySignOut } from "@aws-amplify/ui-react"; // 追加
import awsconfig from "./aws-exports"; // 追加

Amplify.configure(awsconfig); // 追加

function App() {
  return (
    <div className="App">
      <AmplifySignOut /> {/* サインアウトボタン 追加 */}
      <header className="App-header">
        <img src={logo} className="App-logo" alt="logo" />
        <p>
          Edit <code>src/App.js</code> and save to reload.
        </p>
        <a
          className="App-link"
          href="https://reactjs.org"
          target="_blank"
          rel="noopener noreferrer"
        >
          Learn React
        </a>
      </header>
    </div>
  );
}

export default withAuthenticator(App); // 修正

再度アクセスしてみます

http://localhost:3000/

組み込みログインページが表示されました!簡単ですねー

(まぁこのページ。カスタマイズに難があるのですが、それは別のお話で(笑))

ログインしてみます!

上記の組み込みログインページのCreate accountを Click してアカウントを作ります。

下記な感じで登録します。電話番号は適当です

すると登録したメールアドレスに下記のようなメールが届きます

それと同時に WebApp が下記のような Confirm 画面に遷移しているので、

メールで受け取ったコードを入力して、Confirm ボタンを押すと、、

無事ログインできました ❗

追加しておいたサインアウトボタンもきちんとありますね ❗

ここでサインアウトを押して、設定した ID とパスワードでログインできることを確認したら、

今回の実装は終了です

お片付け

下記のコマンドで全てのリソースを削除します

$ amplify delete

感想

Amplify を使うと、とても簡単にログイン画面実装できて楽ですねー!

と思った反面、別のアカウントで別環境にデプロイするときどうするんだろー、、とか既存リソースへの接続は使いにくいな、という感想

本気で amplify を使っていくなら Backend は CDK なり Terraform なり別で用意したほうがよいかなーとか思いました。

とはいえ間違いなく便利 ❗

まとめ

今回は Amplify CLI を使って、React に認証画面を追加してみました ❗

実際に Backend をデプロイして動作を確認して、全て削除してお片付けしました。

今回のリポジトリはこちら

https://github.com/sisi100/react-amplify-cognito/tree/20210710

といっても、amplify のファイルがないので amplify cli でコマンド叩かないと動かないのですが、、

Author

Sisii

インフラが好きなエンジニアぶってるなにか