はじめに
こんにちは、DELISH KITCHEN 開発部でソフトウェアエンジニアをしている24新卒の新谷です。
現在取り組んでいる業務で、共通認証基盤にemailを使った認証を導入するため、Amazon Cognitoを利用しています。(共通認証基盤については、こちらをご参照ください。)その際に、Amazon Cognitoの設定項目について調査する機会があったので、その内容をご紹介します。
Amazon Cognitoとは
Amazon Cognitoは、AWSが提供するウェブアプリとモバイルアプリ用のアイデンティティプラットフォームです。ユーザーの認証・承認を行うユーザープールとユーザーにAWSリソースへのアクセスを許可するアイデンティティプールを持っています。
また、AWSからCognitoを操作するAPIが提供されており、これを利用することで、ユーザーの認証・承認を行う機能を簡単に実装することができます。
$ aws cognito-idp help add-custom-attributes admin-add-user-to-group admin-confirm-sign-up admin-create-user :
Delish Kitchenの認証について Delish Kitchenの認証は共通認証基盤を利用していません。(正確には、認証情報は共有されていますが、Cognitoはそれぞれ独立しています。)そのため、Delish KitchenのCognitoは共通認証基盤で使用しているCognitoとは別のものです。ここでは、それぞれのCognitoの設定を比較し、特に異なる点に焦点を当てて説明します。
サインインエクスペリエンス
Cognito ユーザープールのサインインオプション
ユーザーがサインイン時に以下にある選択肢の中からどの方法でサインインするかを設定することができます。
- ユーザー名
- 電話番号
ユーザー名に関しては、大文字小文字を区別するかどうかの設定も可能です。
Delish Kitchenと共通認証基盤の設定は以下のように設定されています。
Delish Kitchenの設定
- Emailのみでログイン可能
共通認証基盤の設定
- Email、ユーザー名、電話番号でログイン可能
サインアップエクスペリエンス
属性検証とユーザーアカウントの確認
ここでは、メールを自動的に送信するかと、属性(メールアドレスなど)変更時の挙動を設定することができます。 メールの自動送信とは、ユーザーがサインアップした際に本人確認のための検証メールを自動で送信するかという設定です。
Delish Kitchenと共通認証基盤の設定は以下のように設定されています。
Delish Kitchenの設定
- メールの自動送信は許可
- 属性変更は元の属性値を保持しない
共通認証基盤の設定
- メールの自動送信は許可
- 属性変更は元の属性値を保持する
未完了の更新があるときに元の属性値をアクティブに保つとは?
ユーザーがメールアドレス変更後、メールの検証を行っていない場合、元のメールアドレスをアクティブに保つかどうかの設定です。 以下のように最初に設定する際に説明があります。
つまり、この設定が無効になっている場合、ユーザーがメールアドレス変更をすると即時新しいメールアドレスに変更されてしまいます。 Delish Kitchenでは無効となっていますが、これは当時この設定がCognitoにはなかったためです。上記の画像にもあるように、有効にすることが推奨されているので基本的には有効にしておくべきだと思います。
メッセージング
メッセージテンプレート
本人確認などCognitoから送信されるメールのテンプレートを設定することができます。
Delish Kitchenと共通認証基盤の設定は以下のように設定されています。
Delish Kitchenの設定
- メッセージテンプレートは使用せず(初期のまま)
- Lambda トリガーを利用してメッセージをカスタマイズしている (Lambda トリガーは、Cognitoのイベントに対してLambda関数を実行することができる機能です。)
共通認証基盤の設定
- メッセージテンプレートで内容をカスタマイズしている
Delish KitchenでLambdaトリガーを利用している理由
Delish KitchenではLambdaトリガーを使って以下のように独自の検証リンクを生成しています。
https://delishkitchen.tv/auth/email/confirm-signup?code=xxxxxx&username=xxxxxx
(検証リンクを送信するだけであれば、Cognitoは検証コードか検証リンクを選択することができるため、Lambdaトリガーを使用する必要はありません。) Delish KitchenでLambdaトリガーを使っている理由は、検証イベントをトリガーにアプリケーションレイヤーで追加の処理を行えるためです。また、ユーザーIDなどのCognitoが保持していない情報もメールに含めることができるため、Lambdaトリガーを利用しています。
まとめ
今回は、Amazon Cognitoの設定項目について、Delish Kitchenと共通認証基盤の設定を比較しながら説明しました。Cognitoのユーザープールの設定には、最初に一度設定すると後から変更することができない項目もあるため、設定時には慎重に行う必要があります。 また、Cognitoの設定が変更可能でも、認証周りの仕様変更はユーザーにとって大きな影響を与えるため、設計段階で検討することが重要です。