ナビゲーション PHPからNuxt.js + Vue.js、Flutterまでフルスタックの世界へようこそ PHPからNuxt.js + Vue.js、Flutterまでフルスタックの世界へようこそ
  • お客様の買い物かご
  • ログイン
  • 登録
  • カートは空です.
    ショップへ
  • Home
    • DALL-E3を無料で使おう!bing
    • 40代男性が美女に変身
    • リアルタイムボイスチェンジャー
    • TIKTOK×AIで月30万円稼ぐ
    • 2019年に既に実現していた
  • スキル
    • Laravel
      • Laravel入門
      • Laravel実践
    • PHP
      • PHP入門
      • phpl実践
    • React.js
      • React入門
      • React実践
      • Redux
    • Vue.js
      • Vue.js入門
      • Vue.jsテクニック
    • JavaScript
    • Typescript
      • Typescript入門
      • Typescriptテクニック
    • Node.js
      • Node.js入門
      • Node.jsテクニック
    • Bootstrap
      • bootstrap入門
      • bootstrapテクニック
      • AdminLTE
    • Nuxt.js
      • Nuxt.js入門
      • Nuxt.js テクニック
    • Async-Await
    • Serverless
    • Excel
      • Excelダウン・アップ
      • Excl業務管理システム
    • WordPress
      • WordPressカスタマイズ
    • Chart.js
    • ECサイト
    • markdown
    • Next.js
      • Next.js入門
    • Express
      • Express入門
    • Python
      • Python入門
      • Python実践
    • Flutter
      • Flutter入門
      • Flutterテクニック
  • ブログ
    • AIとCanva
    • Canvaの使い方
      • Canva入門(概要説明)
      • Canva入門(文字の変更と装飾)
      • Canva入門(3)
      • Canva入門(4)
      • Canva入門(5)
    • markdown
      • markdown入門
      • markdownテクニック
    • ECサイト
      • カート・サンプル
      • ECサイト構築例
    • 開発のノウハウ・小技など
    • おとぎばなし 4コマ
    • Stable Diffusion – ControlNet入門
    • Lambada開発情報
  • 会社情報

ブログ詳細

  • ホーム
  • AWS Cognitoを使用してログイン機能を実装

AWS Cognitoを使用してログイン機能を実装

libe-irevo@master 2024年2月2日

目次

Toggle
  • はじめに
  • 前提知識
    • フェデレーションとは
  • ユーザープールとIDプールの違い
    • 簡単な説明
  • 一般的なCognitoの使用シナリオ
  • メアドとパスワードを使用したログイン機能
  • ユーザープールの作成
    • サインインエクスペリエンスを設定
    • セキュリティ要件を設定
    • サインアップエクスペリエンスを設定
    • メッセージ配信を設定
    • アプリケーションを統合
    • 確認および作成
  • IDプールの作成
  • ログイン機能を実装する
    • ログインページのUIを用意する
      • CognitoのUIを使う場合
      • 自分でUIを用意する場合
    • IDプールに作成したロールにポリシーをアタッチする
    • ユーザープールにカスタムドメインを割り当てる
  • パブリックサービスを使用したログイン機能
    • 関連記事:

はじめに

この記事では、AWS Cognitoを使用して以下の機能の実装方法を説明します。

  • メアドとパスワードを使用したサインアップ、ログイン、ログアウト、アカウントの削除
    • CognitoのUIを使用する場合
    • 自分でUIを用意する場合
  • パブリックサービスを使用したサインアップ、ログイン、ログアウト、アカウントの削除

前提知識

フェデレーションとは

フェデレーションという用語は、インターネットの各サービス(FacebookやTwitterなどのIDで認証)のユーザー認証の連携のことを指します。
IDフェデレーションといった用語が使われることが多く、既に認証が済んだユーザーIDを使って、別のシステムにアクセス出来るようにする仕組みそのものを指しています。
冒頭で書いたFacebookのパターンでは、認証はFacebookのみで実施し、インターネットの各サービスでは認証は行わず、アクセスに来たユーザーにアクセスを許可するか、 というところだけを実施します。この部分は、「認可」という用語で呼ばれています。
以下のような流れでIDフェデレーションが行われています。

このフェデレーションで最も広く使われているプロトコルがSAML 2.0という方式です。
(SAMLの仕組みについては、認証認可という用語と併せて、解説記事を書いていますので、併せてお読みください。)

AWSではこの他に、Cognitoと組み合わせて、IDフェデレーションを提供出来るパターンがあります。

ユーザープールとIDプールの違い

CognitoにはユーザープールとIDプールという主な2つのコンポーネントがあります。両者の違いについて公式ドキュメントでは以下のように説明されています。

ユーザープールでは認証 (アイデンティティの検証) ができます。ユーザープールを使用すると、アプリユーザーはユーザープールを通じたサインインや、サードパーティーのアイデンティティプロバイダー (IdP) を介した連携ができます。

ID プールでは認可 (アクセスコントロール) ができます。ID プールを使用すると、ユーザーに一意の ID を作成して、他の AWS サービスへのアクセスを許可できます。

簡単な説明

  1. ユーザープール
    ユーザープールでは認証 (アイデンティティの検証) ができます。ユーザープールを使用すると、アプリユーザーはユーザープールを通じたサインインや、サードパーティーのアイデンティティプロバイダー (IdP) を介した連携ができます。
  2. ID プール
    ID プールでは認可 (アクセスコントロール) ができます。ID プールを使用すると、ユーザーに一意の ID を作成して、他の AWS サービスへのアクセスを許可できます。

ユーザープールでまずユーザーが誰なのかをはっきりさせます。例えばこの人はうちのサービスにこの前登録してくれた山田太郎さんというユーザーだからサインインさせてあげよう、あの人はまだ登録してくれてないからまずはサインアップからしてもらおうなどと判断することです。この行為を一般的には認証と呼びます。

IDプールでは、ユーザーが何かしたいと言ってきたときにそれを許可するか判断します。例えばさっき認証した山田太郎さんというユーザーがファイルをアップロードしたいと言ってきたけどこのユーザーにはその権限は与えてないので許可しないようにしよう、田中次郎さんというユーザーがユーザー名を変更したいと言ってきたけど、その権限は与えてるから許可しようなどと判断することです。この行為を一般的には認可と呼びます。

一般的なCognitoの使用シナリオ

以下が参考になります。

メアドとパスワードを使用したログイン機能

Cognitoを用いてログイン機能を実装する場合、Cognitoが用意してくれるUI(サインアップ画面やログイン画面など)を使用するか、自分でUIを用意するかを選べます。以下では、両者の設定を説明します。

ユーザープールの作成

サインインエクスペリエンスを設定

  1. Cognitoのダッシュボードにアクセスし、「ユーザープールを作成」をクリックします。

  2. 「Cognitoユーザープールのサインインオプション」の「Eメール」を選択し、「次へ」を押す

セキュリティ要件を設定

  1. 「パスワードポリシー」はそのままで大丈夫です

  2. 「多要素認証」に関しては今回は「MFAなし」にします
    • これはサインイン(ログイン)の際にMFAを必須とするかどうかの設定ですが、そこまでの強度が必要でなければUXを下げるだけなのでMFAは使用しません。


  3. 「ユーザーアカウントの復旧」はそのままにして、「次へ」を押します

サインアップエクスペリエンスを設定

  1. 「セルフサービスのサインアップ」は有効のままにします

  2. 「属性検証とユーザーアカウントの確認」の「Cognito アシスト型の検証および確認」は、「E メールのメッセージを送信、E メールアドレスを検証」を選択

  3. 「属性検証とユーザーアカウントの確認」の「属性変更の確認」はそのままにします
  4. 「必須の属性」と「カスタム属性」はそのままにして「次へ」を押します

メッセージ配信を設定

  1. 「Eメール」の「E メールプロバイダー」はCognitoの方を選択します。そのほかもデフォルトのままにして「次へ」を押します

    • Cognitoを使って送信する方法だと、送信できる数に制限があるほか、デフォルトではno-reply@verificationemail.comというメアドからの送信になります
      • 詳細はこのドキュメントが参考になります

アプリケーションを統合

  1. 「ユーザープール名」の「ユーザープール名」には任意のこのユーザープールの名前を入力します。自分のUIを使う場合はチェックを外しましょう

    • CognitoのUIを使用したい場合はチェックを入れ、「ドメイン」の「ドメインタイプ」には「Cognitoドメインを使用する」を選択し、「Cognitoドメイン」には任意のドメインプレフィックスを入力してください

  2. 「最初のアプリケーションクライアント」の「アプリケーションタイプ」は「パブリッククライアント」を選択、「アプリケーションクライアント名」は任意の名前を入力、「クライアントのシークレット」は「クライアントのシークレットを生成しない」を選択し、「次へ」を押す
    • Amazon Cognito JavaScriptSDKはクライアントシークレットを使用しないので、例外処理が行われてしまうため、「クライアントのシークレットを生成しない」を選択する1らしいです。自分もよくわかってないんで、誰か教えてください

    • CognitoのUIを使用する人は「クライアントのシークレット」の下に「許可されているコールバックURL」にhttp://localhostと入力しましょう。httpsではなく、httpにしてください

確認および作成

確認して問題なければ「ユーザープールを作成」を押しましょう。

IDプールの作成

  1. ユーザープール作成後の画面から作成したユーザープール名をクリックし、ユーザープールの詳細画面を表示します。後で必要なので「ユーザープールID」と「クライアントID」(アプリケーションの統合タブに書いてあります)をメモします
  2. ユーザープール作成後の画面からIDプールの画面に行くまではちょっとわかりづらいです。まずはユーザープール作成後の画面の上にあるパンくずリストの「Amazon Cognito」をクリックしましょう

  3. Cognitoのダッシュボードに戻ったら、「ビジネスケースからはじめる」の下のリストから「AWSのサービスへのアクセス権を付与する」という項目を選び、下の「IDプールを作成」を押しましょう

  4. 「IDプール名」に任意の名前を入力します

  5. 「認証プロバイダー」の「Cognito」タブを選択し、先ほどメモした「ユーザープールID」と「クライアントID」をそれぞれ入力し、「プールの作成」を押します

  6. 「許可」を押します

ログイン機能を実装する

ログインページのUIを用意する

CognitoのUIを使う場合

  1. クライアントIDを確認したのと同じ手順で、作成したユーザープールの詳細画面にアクセスして、「アプリケーションの統合」タブを開きます
  2. 「アプリケーションクライアント名」に表示されているアプリケーションクライアントをクリックし、詳細画面を開きます
  3. 「ホストされたUI」の「ホストされたUIを表示」をクリックします。するとサインイン画面が表示されます。「Sign Up」をクリックします

  4. サインアップ画面に遷移するので自分のメアドと任意のパスワードを入力しましょう

  5. すると認証コードの入力を求められるのでメールを確認して届いたコードを入力してボタンをクリックします
    • 認証コードが届かない場合は迷惑メールを確認してみてください。私の場合も迷惑メールに入ってました
    • ボタンをクリック後はコールバックURLとして指定したhttp://localhostにリダイレクトすると思うのですが、もちろんlocalhostは動いてないのでエラーメッセージが表示されます。ページを閉じてもう一度「ホストされたUIを表示」をクリックすると同じエラーメッセージが出てくるlocalhostにリダイレクトされるので、ログイン状態が保持されているんだなとわかります

自分でUIを用意する場合

以下の記事が参考になります。

IDプールに作成したロールにポリシーをアタッチする

  1. IDプールに作成したロールの名前を確認する
    • IDプールの詳細画面にアクセスしたいのですが、これまたわかりにくい場所にあります。まずCognitoのダッシュボードを開きます。左側のメニューバー(折り畳まれている場合は開いてください)にある「フェデレーティッドID」をクリックします

    • すると作成したIDプールが表示されるので、名前部分をクリックしてください

    • 右上にある「IDプールの編集」をクリックすると「認証されていないロール」と「認証されたロールの名前」が確認できます
  2. 今度はAWSのサービス一覧からIAMのダッシュボードに行って、「ロール」にアクセスすると先ほど確認した2つのロールが表示されているのが確認できます。
  3. 認証されたロールの方をクリックして詳細画面に行き、「許可」タブにアクセスして、「許可を追加」 > 「ポリシーをアタッチ」で任意のポリシーをアタッチします

ユーザープールにカスタムドメインを割り当てる

自分のドメインを持っている場合はそれを割り当てることでログイン機能を自分のサイトに実装できます。ドメインを割り当てる前にRoute53にてDNSレコードを追加する必要があります。

  1. Route53のダッシュボードにアクセスします
  2. 「ホストゾーン」に行き、ドメイン名をクリックします
  3. 「レコード」タブにて、「レコードを作成」をクリックします
  4. 「レコード名」にauthと入力します
    • ホストされた UI への独自のドメインの使用で言及されているようにCognitoではルートドメインを使用できず、サブドメインを使う必要があります。特にauthというサブドメインを使用するように推奨されています。
  5. 「レコードタイプ」は「A」を選択します。
    • Aレコードやその他のDNSレコードについてはこの記事が参考になります
  6. ユーザープールのダッシュボードを開き、作成したユーザープールの詳細画面にアクセスし、「アプリケーションの統合」タブを開きます。
  7. Cgnitoドメインの削除
  8. 「ドメイン」の「アクション」から「カスタムドメインを作成」をクリックします
  9. 「カスタムドメイン」に使用したいドメイン名を入力し、「ACM証明書」から証明書を選択し、「カスタムドメインを作成」を押す
    • ACM証明書がない場合は「ACM証明書を作成」を押して作成してください

パブリックサービスを使用したログイン機能

  1. はじめてのCognito! CognitoのログインUIを使って認証システムを実装したまとめ ↩

関連記事:

Serverlesss(AWS Lambda) Amazon Location Serviceとは?(3)+Cognito Serverlesss(AWS Lambda)(1)セットアップ Serverlesss(AWS Lambda)(4)ローカル環境 Serverlesss(AWS Lambda)(3)dynamodb Serverlesss(AWS Lambda)(2)cognito設定 Serverlesss(AWS Lambda)(5)dynamodb・NoSQL Serverlesss(AWS Lambda)(6)関連記事 AWS Cognitoを使うべき3つの理由 AWS Lambda DynamoDB でCRUD AWSとは? AWS S3入門! AWS EC2入門! AWS RDS入門! AWS EC2入門(Apache) AWS EC2入門(EC2を立ててログイン) AWS RDS入門(RDSでデータベースを構築する) AWS LambdaでPythonを使う AWS EC2の作成〜Apacheの起動 WinSCPでAmazon S3に接続 AWS のアーキテクチャ図を描く Amazon Location Serviceとは?(1) Amazon Location Service+Vue.jsマップアプリケーション AWSアカウント作成の概要 AWSでWeb(4)独自ドメイン名でサーバーを公開する AWSでWeb(3)EC2とRDSでWordPress AWSアカウントを作る(1) AWSアカウントを作る(2)普段使いのIAMユーザーを作る AWSアカウントを作る(3)EC2を立ててログインする AWSアカウントを作る(4)AWS CLIでS3を操作
AWS,cognito

Latest Posts

  • LINE入門
  • JavaScript入門
  • JavaScript JSON編集(記事)

post categories

  • React入門 (9)
  • PHP (12)
  • Swift入門 (3)
  • docker入門 (4)
  • タスク管理 (1)
  • CakePHP実践 (2)
  • AWS Amplify (11)
  • React実践 (7)
  • REST API (4)
  • Firebase (1)
  • VSCode入門 (2)
  • プロジェクト管理 (3)
  • Cake (3)
  • SNSログイン (4)
  • Wordpressカスタマイズ (27)
  • 勤怠管理 (8)
  • Firebase入門 (1)
  • VSCode (4)
  • 見積管理 (2)
  • Django (1)
  • EC2 (8)
  • Redux (9)
  • ガンチャート (2)
  • Android Studio (1)
  • GitHub (4)
  • 請求管理 (2)
  • サンプル集 (9)
  • AWS CLI (1)
  • Next.js (11)
  • 売上管理 (7)
  • Android Studio入門 (1)
  • GitHub入門 (4)
  • ジョブ管理 (1)
  • オブジェクト指向 (1)
  • RDS (5)
  • Chart.js (25)
  • Excelダウン・アップ (2)
  • Pixel Watch (1)
  • Python実践 (11)
  • 休暇・休日管理 (2)
  • Canva画像編集 (1)
  • ALB (1)
  • Chart.js入門 (5)
  • Excl業務管理システム (12)
  • Dartテクニック (2)
  • AWS (38)
  • 資産管理 (2)
  • Docker Compose (1)
  • Terraform (1)
  • Chart.js実践 (23)
  • Flutter (11)
  • Flutterテクニック (2)
  • WSL2 (2)
  • リード管理 (1)
  • LINE (1)
  • S3 (3)
  • Wordpress (31)
  • AdminLTE (3)
  • Flutter入門 (8)
  • Next.js入門 (8)
  • CI/CD (2)
  • イベント管理 (2)
  • LINE ステップ (1)
  • APACHE (3)
  • 越境サイト (8)
  • AdminLTE‐Laravel版 (2)
  • Dart (8)
  • Express (4)
  • SQL (6)
  • Dashboard (1)
  • AWSアカウント (7)
  • アーキテクチャ図 (1)
  • スクール (1)
  • AdminLTE実践 (3)
  • Dart入門 (6)
  • Express入門 (4)
  • Linux (3)
  • CRM (3)
  • コンテナ環境 (3)
  • ドメイン (1)
  • クラウドSC (1)
  • Canva (1)
  • Java (2)
  • Python (15)
  • 小技集 (12)
  • RFM分析 (2)
  • API Gateway (2)
  • 予約システム (1)
  • Laravel (11)
  • Java入門 (2)
  • Python入門 (13)
  • 業務システム (18)
  • SFA (2)
  • DynamoDB (6)
  • Async-Await (1)
  • Laravel入門 (11)
  • Kotlin入門 (1)
  • Go言語 (1)
  • 顧客管理 (7)
  • FuelPHP (4)
  • Cognit (10)
  • phpl実践 (12)
  • PHP入門 (9)
  • Kotlin (1)
  • Go言語入門 (1)
  • 従業員管理 (2)
  • FuelPHPの入門 (4)
  • CRUD (2)
  • React.js (16)
  • Laravel実践 (4)
  • Swift (3)
  • docker (4)
  • 給与管理 (2)
  • CakePHP入門 (1)
  • Amazon Location Service (6)
  • Nuxt.js (20)
  • Nuxt.js入門 (10)
  • Nuxt.jsテクニック (14)
  • Vue.js (23)
  • Vue.js入門 (10)
  • Vue.jsテクニック (19)
  • Node.js (8)
  • Node.js入門 (3)
  • Node.jsテクニック (7)
  • Bootstrap (18)
  • bootstrap入門 (1)
  • bootstrapテクニック (17)
  • Typescript (17)
  • Typescript入門 (2)
  • Typescriptテクニック (15)
  • Excel (16)
  • Excelダウンロード (3)
  • Excleインポート (3)
  • markdown (6)
  • markdown入門 (1)
  • markdownテクニック (3)
  • ECサイト (8)
  • カート・サンプル (3)
  • ECサイト構築例 (8)
  • JavaScript (15)
  • Serverless (19)
  • SHOP (4)
  • その他の技術情報 (20)

Post Tags

Apache API Gateway Async-Await CakePHPの実践 chart ChatGPT cognito CRUD Dashboard Django dynamodb ECサイト構築例 Firebase Flutterテクニック function GitHub Go言語 Go言語入門 Kotlin入門 lambda markdown markdownテクニック markdown入門 MongoDB MySQL Next.js postgresql Python入門 Python総合学習【オブジェクト指向編】 Python総合学習【応用編】 Python総合学習【活用編】 React.js REST API Serverless SHOP TypeScript Typescript実践 Vue.js カスタム投稿 カート・サンプル コンテナ環境 サンプル集 勤怠管理 業務システム 顧客管理
Copyright © Chiba Syetems All rights reserved