Cognitoでログイン機能?
はじめに
このページは、Cognitoについて基本的な内容から、マネジメントコンソールで&CFでの構築までまとめたページとなっております。
Cognitoってなんだ?
AWSが提供しているサーバーレスな認証機能こと。
APIベースで実装されるモバイルやWebアプリ向けのユーザー認証で使われている模様。
Cognitoの特徴
- サーバーレス
AWS上に認証システムが構築されており、最小限の開発コスト・管理コストで実装することができる
また、AWSの他のサービスとも連携可能となっていて、Application Load Balancerと連携して、ユーザー認証をALBに任せたり、Lambdaと連携してサインインフローの変更なども可能。 - サードパーティとの連携
Google・Amazon・Facebookなどの外部IDプロバイダーと連携を行うことが可能 - 豊富なセキュリティ機能
業界の中でも標準のセキュリティを持っており、以下内容でセキュリティ機能を実装することができる。 - Cognito独自のログインUIが存在する
ログイン画面を実装しなくてもCognitoが予め持っているログインUIを使用すれば、すぐにログイン機能を実装することができる。
・電話番号とEmailの検証
・多要素認証(MFA)の利用
・SMSテキストメッセージ
・TOTPソフトウェアトークン
・クライアントデバイスの追跡
・アドバンスドセキュリティの機能
・侵害された認証情報が使われていないかの確認
・アダプティブ認証(リスクに応じてMFAの利用を求めたり、ブロックしたりする)
料金体系
Cognitoは従量課金性となっていて、使ったら使った分だけお金がかかる仕組みとなっている。
具体的には、月間アクティブユーザー数(MAU)に応じて計算されるので、ユーザーが多ければ多いいほどお金がかかる仕組みとなっている。
主要な用語
-
ユーザープール(認証機能)
ユーザー管理・サインイン・サインアウトなど、認証を制御するための機能のこと。 -
フェデレーティッドアインデンティティ(IDプールと言われ、認可機能)
ユーザープールのアカウントに対して、IAMロールの付与を行う機能のこと。
作成されるアカウントはユーザープールとは別物になっているとのこと。 -
Cognito Sync
IDプールで管理されるユーザー単位にデバイス間のアプリデータを同期する機能。
(AppSyncというサービスができたため、現在使用は推奨されていない)
利用されるシチュエーション
- ユーザーのログイン機能
- アプリのAPIへサクセスする際にのトークン機能
実際に簡単なログイン画面を作成してみよう
今回はCognitoが提供するUIを使用したログイン機能を実装してみようと思います。
(日本語対応はしていないみたいです)
AWSマネジメントコンソールで作成
ログイン後ローカルのVueの初期画面が表示されるように作成していきます。
※基本的にデフォルトの設定を作成していく。
-
まずはマネジメントコンソールからユーザープールの作成を選択
-
サインオプションでEメールを選択
-
セルフサービスアカウントの復旧を選択
-
自己登録を有効化を選択
-
CognitoでEメール送信を選択
-
ユーザープール名とホストされたUIにチェック
-
ドメインにはアプリケーションで使用するドメインを使用
-
アプリケーション名を入力
-
作成されたユーザープールからアプリケーション統合のタブを選択し、アプリクライアントと分析をクリック
-
ホストされたUIをクリック
-
Cognitoで用意しているUIが表示されるので、案内通りにユーザー登録をしていく
-
Vueの初期画面が表示されたら成功
-
ユーザープールから作成したユーザーがいることを確認する
CDKで作成
// User Poolの作成(設定していない項目は基本デフォルトの値が設定される)
const userPool = new cognito.UserPool(this, "userpool", {
// サインイン・アウト時に何を使用するのか設定することができる
signInAliases: {
email: true,
},
// 設定しない場合はコンソールの場合と同じデフォルト設定
// passwordPolicy: {
// minLength: 10,
// requireLowercase: false,
// requireUppercase: false,
// requireDigits: false,
// requireSymbols: false,
// tempPasswordValidity: cdk.Duration.days(7),
// },
// セルフサービスのサインアップ設定(ログイン画面からユーザーの登録ができる)
accountRecovery: cognito.AccountRecovery.EMAIL_ONLY,
// PassWordを忘れた際にユーザー自信で復旧できるようにする設定
selfSignUpEnabled: true,
// ユーザープールの名前
userPoolName: "login-test",
// cdk destroyでの削除設定 デフォルトは削除されない
removalPolicy: cdk.RemovalPolicy.DESTROY,
// 誤ってユーザープールを削除してしまうことを防ぐことができる設定
// deletionProtection:true
// Cognitoでの操作を行うタイミングでCognitoからイベントを受信してLambdaを実行する設定
// lambdaTriggers: {
// preSignUp: サインイン時に実行するラムダ名
// customMessage: パスワードの再設定等を行う際に実行されるラムダの名前,
// },
// ユーザーを登録する際に使用する属性
standardAttributes: {
email: {
required: true, // サインアップ時にemailアドレスを必須にする
mutable: true, //true場合emailアドレスの変更が可能
},
},
});
// User Pool Clientの追加
userPool.addClient("userPoolClient",{
// Cogunitoと結びつけるアプリの名前(任意な名前でOK)
userPoolClientName: 'userPoolClient',
// クライアントシークレットの作成設定
generateSecret: false,
// サインイン・アウトの設定
oAuth: {
callbackUrls: ['http://localhost:8080'], // サインイン時のページのURL
logoutUrls: ['https://classmethod.jp/'], // サインアウト時のページのURL
flows: { authorizationCodeGrant: true },
// OpenID Connect のスコープ
scopes: [
cognito.OAuthScope.EMAIL,
cognito.OAuthScope.PROFILE,
cognito.OAuthScope.OPENID,
],
},
})
// Cognitoのが用意している認証画面を設定するのに必要なドメイン設定
userPool.addDomain('userPoolDomain', {
cognitoDomain: { domainPrefix: 'marumegane' },
});
TODO
- 独自のログイン画面を実装してCognitoを使用したログイン機能を作成
- IDプールを使用したAWSリソースのアクセス制御の実施
参考サイト
-
AWSの公式スライド
https://d1.awsstatic.com/webinars/jp/pdf/services/2020 -
Cognitoの実装について
https://qiita.com/rihib/items/e5bbd522c96925102dba -
AWS CDKの公式サイト
https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_cognito.UserPoolClientOptions.html -
CDKの参考サイト
https://dev.classmethod.jp/articles/cognito-hosted-ui-signup-error/ -
Cognitoの機能について
https://www.sunnycloud.jp/column/20210803-01/
Discussion