echo("備忘録");

IT技術やプログラミング関連など、技術系の事を備忘録的にまとめています。

【AWS】Cognitoによる認証を実装する(その1)

概要

今まではServerless FrameworkやCloudFront周りのネタでしたが、今回からはしばらくCognito関連のお話。
今回はユーザープール&IDプールによる、認証基盤作成について。

※ちなみに次回以降は、下記ネタの予定。

  • Amplify/Authを利用した認証処理
  • 認証処理のLambdaトリガー

今回触れること

  • ユーザープール作成
  • IDプール作成

Cognitoの認証基盤について

以下の2つがあります。

プールの種類 説明 リソースへのアクセス
ユーザープール Cognitoのベースで、ID・Eメール・パスワードなどによるユーザー認証関連の基盤を提供する。 Cognito認証の有無
IDプール ユーザープールを使用してサインインしたユーザーに、設定したロールを割り当てる。 ロールにアクセス権限があるかどうか

今回は主に「ユーザープール」について記載します。

手順0 ユーザープールの作成

  • AWSコンソールで「Amazon Cognito」を選択する
  • [ユーザープールの管理] - [ユーザープールの作成] をクリックする。

手順1 ユーザープール名の設定

  • プール名:作成するユーザープール名を入力すればOKです。
  • 作成方法:下記2つから選択できます。
    • デフォルトを確認する:全項目にCognitoのデフォルト値が設定されます。(作成確定前に変更可能です)
    • ステップに従って作成する:順番に1項目ずつ設定を行います。(自分でカスタマイズしたい場合はこちら)

※この記事は「ステップに従って作成する」を前提に記載してます。

手順2 サインイン方法&属性の指定

サインイン方法、およびサインアップに必要なユーザー属性を設定します。
※これらは一度ユーザープールを作成すると、あとで変更できないので注意!

サインイン方法
大項目 オプション項目 説明 備考
ユーザー名 ユーザー名(username)でログインする オプションは複数選択可
Eメールサインインも許可 メールアドレス(email)でもログイン可能にする
電話番号サインインも許可 電話番号(phone_number)でもログイン可能にする
任意ユーザー名 ユーザーが許可した属性(≒カスタムユーザー名)でもログイン可能にする ユーザー名を変更したい場合に選択。
(Cognito標準のユーザー名(user_name)は変更不可なので)
Eメールおよび電話番号 Eメールまたは電話番号でログインする オプションは1つのみ選択可能
Eメールを許可 メールアドレスでのみログイン可能にする
電話番号を許可 電話番号でのみログイン可能にする
両方を許可 メールアドレス/電話番号のどちらでもでもログイン可能にする ユーザー名が選択可能
ユーザー属性(attributes)

サインアップする際に、入力を必須とするユーザー属性を指定します。(どんな属性があるかは、画像を参照)
チェックを付けた属性は「入力必須」となり、サインアップ時に値を指定しないと、サインアップ不可となります。

  • チェックを付けてない項目は「使用不可」ではなく「任意項目」になるだけなので、サインアップ時に値を指定すれば、問題なく使用&登録可能です。
  • 「email」や「phone_number」は、後述する多要素認証でEメールやSMSでコードを送る場合、必須になります。
カスタム属性について

属性を自分で追加することも可能です。
「カスタム属性を追加する」をクリックすると、自分でカスタム属性を設定可能です。(下記項目を指定できます)

項目 説明 備考
タイプ 文字型(string)/数値型(number)
名前 カスタム属性の名前です。 作成後、自動で「custom:」が先頭に付与されます(※)
範囲 文字列の長さの範囲(文字型)/値の範囲(数値型) 「タイプ」により異なる
変更可能 値を変更できるかどうか

※Amplify/AuthやAWS-SDKAPIで指定する場合、下記の様にしないとエラーになります。

attributes = {
    // これはNG  
    "hoge" : "fuga"  
  
    // こうしないといけない
    "custom:hoge" : "fuga"
}

f:id:Makky12:20190915172150p:plain

セキュリティ設定

パスワード強度設定

パスワードの強度を設定できます。設定可能なのは下記です。

  • パスワードの最低文字数
  • パスワードの必須入力文字
    • 数字
    • 特殊文字(=記号)
    • 半角大文字
    • 半角小文字
自己サインアップの許可
項目 説明 備考
管理者のみ許可 ユーザープールを作成するAWSアカウントの管理者、または開発者(credential認証者)のみサインアップ可能にする アプリから作成するには「adminXXX」というメソッドを使う必要がある。(signUpでは不可)
ユーザーの自己サインアップを許可 AWSアカウントの管理者、開発者でなくてもサインアップ可能にする signUpメソッドで、サインアップ可能。ただし認証コード等による検証が必要(これについては後述)
有効期限の設定

管理者(または開発者)がサインアップした場合、そのアカウントには「仮パスワード」が付与されます。
その仮パスワードの「有効期限」を設定します。

※この場合、対象アカウントは(仮パスワードでの)初回ログイン時に「本パスワード」を設定する必要があります。

f:id:Makky12:20190915172432p:plain

多要素認証(MFA)設定

多要素認証(MFA)について、下記を設定できます。

項目 説明 備考
多要素認証の有効化 オフ/省略可能/必須 「省略可能」の場合、ユーザーが多要素認証を使用するかどうかを設定できます。
※オフにしても、自前で多要素認証を実装できます。
第二の要素 SMS/ワンタイムパスワード(TOTP) 「SMS」の場合、登録した電話番号に検証コード送信します。
「TOTP」の場合、時間ベースで一意に生成される認証コード値により認証を行います(※)
送信先 Eメール/電話番号/両方/なし 検証コードの送付先。「両方」にした場合、(なぜか)SMSにしか送られない模様。
「なし」にした場合、パスワードを忘れた際の再設定ができません。(再設定用コードを送れないので)
SMSロールの提供 (ロール名を記載) SMSによる認証コードを送信する場合、SMS送信に必要なロールを指定する。
この画面で新規作成することも可能。
※SMS送信しないなら空欄でOK

Eメールアドレスの設定

Eメールで検証コードを送信する場合の設定です。
事前にSES(Simple EMail Service)に検証済Eメールを登録済の場合、SESの登録情報から下記を選択できます。

  • リージョン
  • 送信元Eメールアドレス
  • 返信先Eメールアドレス

※SES登録していない、または使用しない場合、どれもデフォルトのままでOK。

その他、Eメール送信にSESを使用するかどうかを選択できます。
使用するする場合は上記のメール設定が、使用しない場合はデフォルトのメール設定が適用されます。

※使用しない場合、送信元Eメールアドレスは「no-reply@verificationemail.com」となります。

f:id:Makky12:20190915172514p:plain

メッセージのカスタマイズ

検証コード送信メール、及びユーザー名&仮パスワード送信メールの内容を設定できます。
それぞれ、下記のメールが送信されます。

状況 送信メール
サインアップ完了直後(検証コード未送信時) 検証コード送信メール
管理者(or 開発者アカウント)でのサインアップ完了時 ユーザー名&仮パスワード送信メール

設定できるのは下記項目です。

  • 検証タイプ(検証コード/検証用URL)
  • 件名(Eメールのみ。SMSは不要)
  • メール本文

※下記スクショの通り、

  • ユーザー名:{username}
  • 検証コード、パスワード: {####}

とすると、実際のメールに上記が埋め込まれます。

f:id:Makky12:20190915172710p:plain
f:id:Makky12:20190915172731p:plain

タグ&デバイス記憶の設定

ユーザープールにタグを埋め込むかの設定です。
タグを埋め込みたい場合、キー&値のペアを設定します。
(無理に埋め込む必要はありません。)

またデバイス記憶は、下記の設定を行えます。

項目 説明 備考
バイス記憶の有効化 常に/ユーザーが選択/記憶しない
第二の認証の省略 はい/いいえ 「はい」にした場合、記憶済デバイスからのアクセスの場合、認証コード/リンク/TOTPによる認証をスキップ可能。
バイスを記憶しない場合、設定不要です

なんかかなり長くなってきたので、続きはその2で。