echo("備忘録");

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

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

概要

その1で、Cognitoユーザープールの説明の前半部分を書きましたが、今回はその後半になります。

アプリクライアントの作成

このユーザープールを使用して認証を行うアプリの設定をします。
設定項目は下記の通り。

項目名 説明 備考
アプリクライアント名 このユーザープールを使用するアプリの名称
トークンの有効期限を更新 ログイン時に発行される、各種トークンの有効期間(日) デフォルトは30日。この期限を超えたら、トークンのリフレッシュが必要になる
クライアントシークレットを作成 クライアント用のシークレットを作成する SDKではクライアントシークレットを使用しない(使用すると例外を出す)ので、SDKを使用する場合はチェックを外すこと
サーバーベースの認証でサインイン API を有効にする AWSコンソールなど、サーバーベースでのアカウント作成を許可する チェック推奨。コンソール以外にも、AWS CLIからアカウント生成&パスワード認証を行えるようになる。(下記リンク参照)
カスタム認証のみを許可する 標準の認証フローを使わず、Lambdaトリガの「認証チャレンジ」による認証フローのみ許可する Lambdaトリガについては後述
アプリベースの認証でユーザー名とパスワードの (SRP を使用しない) フローを有効にする Secure Remote Passwordプロトコルを使用しない、使用するアプリからのID&パスワードのみによる認証を有効にする 公式ページによると、旧(レガシーな)システムからのユーザー移行を行う場合、チェックを付けると移行がスムーズとのこと。(逆に言えば、それ以外ではチェックを外すのがよい)

また、「属性の読み込みおよび書き込みアクセス権限を設定する」をクリックすると、各種ユーザー属性(attributes)の読み込みや書き込みの許可/不許可が設定できます。(デフォルトはすべて読み書き可能)

f:id:Makky12:20190916180541p:plain
f:id:Makky12:20191010194927p:plain

Lambdaトリガの設定

Cognitoでは、各種認証処理(サインアップ・サインインなど)の前後に、Lambda関数による独自の処理を追加することができます。
その独自処理を行うタイミング&実行するLambda関数を定義します。

これを使用すると、例えば以下のようなことができます。

  • サインアップ時に、検証コードや検証リンクなしにメールアドレスを強制的に「検証済み」にする
  • ログイン時に、Cognitoによる認証(ID・パスワード・検証コードなど)以外に、独自の認証ロジックを追加できる(下記リンク参照)
  • サインアップ&認証コード送信時に送るメールの内容を、自由にカスタマイズできる。

てかこれ、実際触ると分かるんですが、本当に便利なんです。

※このLambdaトリガに関しては、次回or次々回くらいに、ブログに記載しようと思ってます。

ちなみに、下記公式ページに詳しいことが記載されています。
また、Lambdaトリガ処理は下表のタイミングで実施することができます。(公式ページより抜粋)

f:id:Makky12:20191010195647p:plain

f:id:Makky12:20190916180600p:plain

f:id:Makky12:20190916180619p:plain

あとは最終確認として設定内容が表示されるので、問題なければ「プールの作成」をクリックすると、ユーザープールの作成が実行されます。

フェデレーテッドアイデンティティ

Cognitoには、「認証を行ったユーザーに対して、特定のロールを割り当てる」ことができる「フェデレーテッドアイデンティティ」という機能があります。
これを利用すると、例えば下記のことができます。

  • ユーザープールごとに、使用できる機能(例えば、実行できるLambdaなど)を割り当てることができる
  • 認証(=ログイン)をしていないユーザーにも、権限を与えることができる。
    • 認証の有無で、実行できる権限を変更できる
  • 外部SNSなど、Cognito以外の認証(=OAuth)をサポートし、権限を設定できる
IDプールの作成

「新しいIDプールの作成」画面では、下記の設定を行います。
※ちなみに「IDプール」は、「ユーザープール」とは別物です。

項目名 説明 備考
IDプール名 このIDプールの名称
認証されていないID 未認証(=未ログイン)のユーザーに対しても、AWSへの各種リソースへのアクセスを有効にするか パブリックなアクセスが可能になるので、ロールの設定には要注意
認証プロバイダ 認証に使用するプロバイダ。Cognitoの他、FacebookGoogleなどのSNSも設定可 設定項目はプロバイダ毎に異なる。Cognitoの場合、「ユーザープールID」と「アプリクライアントID」

f:id:Makky12:20190916180641p:plain

ロールの設定

「認証されたユーザー」及び「認証されていないユーザー」それぞれに割り当てるロールを設定できます。
(先述の「認証されていないID」のチェックを外しても「認証されていないユーザー」が表示されるのは、なんか変ですが...)

「認証されたユーザー」及び「認証されていないユーザー」それぞれに、下記を編集します。
最後に「許可」をクリックすればOKです。

項目名 説明 備考
IAMロール 適用するIAMロール(既存項目の使用or新規作成)
ロール名 (IAMロール新規作成時の)ロールの名前
ポリシードキュメント 適用するポリシー(=インラインポリシー) 「編集」ボタンをクリックすると編集可能

f:id:Makky12:20190916180705p:plain

と、長々と書いてしまいましたが、これで一通りCognitoユーザープールの説明ができました。

次回からは、実際にソースコードから下記を実行しようと思います。

  • Cognitoユーザープールを行った認証
  • 先述の「Lambdaトリガ」の具体的な使用例