Boto3でCognitoの初回パスワード変更と一時認証情報取得を実装する

記事タイトルとURLをコピーする

この記事は約3分で読めます。

はじめに

こんにちは、中途入社してもうすぐ半年になります、アプリケーションサービス部 ディベロップメントサービス1課の北出です。

今回は、Cognitoによる初回パスワード変更の強制や、Cognitoから発行されるAWSリソースへアクセスするための一時認証情報の取得をPython(Boto3)で実装しましたので、ざっくりとですが方法を紹介します。 クライアント側の実装なのでJavaScriptやTypeScriptのほうが需要がありそうですが、私はあまりそちらに明るくないのでPythonになります。

システム構成

本記事では以下のようなシステム構成を想定しています。

今回の認証の流れ

本記事の大まかな流れは以下になります。

  • ユーザープールの作成(マネジメントコンソール)
  • ユーザーの作成(マネジメントコンソール)
    • マネコンから管理者権限でユーザーを作成することでユーザーのログイン時にパスワード変更を強制します。
  • IDプールの作成(マネジメントコンソール)
  • 初回パスワード変更
  • ログイン
  • 一時認証情報の取得
  • AWSリソースへのアクセス

認証方式はこちらのドキュメントのクライアントの認証フローを参考にしてください。

準備

ユーザープールの作成

以下の流れでマネジメントコンソールからユーザープールを作成してください

  • Cognitoのページへ行きます
  • ユーザープール→「ユーザープールを作成」を選択します
  • 画像のように以下の部分を設定します
    • アプリケーションタイプ:シングルページアプリケーション
    • サインイン識別子のオプション:ユーザー名
    • サインアップのための必須属性:email
  • 作成します

ユーザーの作成

ユーザープールを作成したら引き続き、マネジメントコンソールからユーザーを作成します。

  • ユーザープールから作成したユーザープールを選択します
  • 左側ダッシュボードの「ユーザー」から、「ユーザーを作成」を選択します
  • 画像のように以下の部分を設定します
    • Eメールで招待を送信
    • ユーザー名
    • メールアドレス
      • 今回は検証済みにしなくとも動作します
    • 仮パスワード:仮パスワードを生成
  • 作成します

作成されると、設定したメールアドレスに自動生成された仮パスワードが送られてくるはずです。

IDプールの作成

ユーザープールを作成することで、だれがアクセスしてきているかの認証の基盤が作られます。 認証しただけでは、ユーザーがどのAWSリソースにアクセスしていいかの権限の付与ができていません。この認可の基盤であるIDプールを作成します。

  • Cognitoのページに行きます
  • IDプール→「IDプールを作成」を選択します
  • IDプールの設定をします
    • 認証
      • ユーザーアクセス:認証されたアクセス
      • 認証されたIDソース:Amazon Cognito ユーザープール
    • IAMロール
      • 新しいIAMロールを作成
      • 本記事ではS3バケットへのアップロードを行いますので、アップロードをする権限を付与してください
    • IDプロバイダーを接続
      • ユーザープールID:作成したユーザープール
      • アプリクライアントID:ユーザープール作成時にデフォルトで作成されているものを選択
  • 他の設定はデフォルトで問題ありません。
  • 作成します

実装

ここまでの手順で最低限必要なものはそろっているはずなのでここからPythonプログラムに移っていきます。 プログラム内でユーザープールIDやアプリクライアントIDなどのパラメータを使用しますが、マネジメントコンソール上やAWS CLI で取得できるため、それらの取得手順は省略します。

ディレクトリ構成

本記事で実装するディレクトリ構成は以下になります。

.
├── __init__.py
├── change_initial_password.py
├── config.ini
├── s3_upload.py
├── libs
│   ├── __init__.py
│   ├── get_access_token.py
│   ├── logger_config.py
│   ├── session_manager.py
│   └── srp.py

初回パスワード変更

このステップで実装する部分は以下になります。

  • change_initial_password.py
    • 初回パスワード変更をするためのメイン部分です
  • config.ini
    • CognitoユーザープールIDや一時パスワード、変更後のパスワードを定義し格納します。ファイルの中身は本記事では記載しませんので、各Pythonファイルから必要なものを判断し作成してください。
  • libs/srp.py
    • Cognitoの認証で必要なSRP値の計算をするプログラムです。

以下で各プログラムの中身を記述します。

libs/srp.py

このコードはこちらを使わせていただいています。

SRPとは Secure Remote Password の略のプロトコルで、詳しい説明は省きますが、パスワードを直接サーバーに送信しないので盗聴などに強いものと認識してもらえれば大丈夫です。

change_initial_password.py

無事パスワードが変更できていれば、マネジメントコンソールでCognitoのユーザーステータスが確認済みになっているはずです。

一時認証情報の取得

このステップで実装する部分は以下になります。

  • libs/get_access_token.py
    • ユーザー名とパスワードからAWSリソースへアクセスするための一時認証情報を取得するための関数です。この関数をつかった実装は次のステップで記述します。

libs/get_access_token.py

AWSリソースへのアクセス

このステップで実装する部分は以下になります。

  • libs/session_manager.py
    • 前ステップで作成した関数をつかって、一時認証情報を取得し、Boto3セッションを作成します。
  • s3_upload.py
    • Boto3セッションからS3クライアントを作成し、S3バケットのファイルをアップロードします。

libs/session_manager.py

s3_upload.py

アップロード先のS3バケットのプレフィックスにidentity_idを指定しています。これは、ユーザーごとに割り当てられる一意のIDです。 例えば、複数のユーザーがいるときに、自分以外のユーザーのバケットにアクセスできないようにするといった制御をするときに使えると考えています。 このあたりは次回以降の記事で説明できればと思います。

おわりに

業務でBoto3でCognitoの認証を実装する必要があったのですが、一通りの流れが書かれた記事があまりなかったので今回記事にしてみました。(単にpythonでの需要がないだけの可能性もありますが)

何かの参考になれば幸いです。

北出 宏紀(執筆記事の一覧)

アプリケーションサービス本部ディベロップメントサービス1課

2024年9月中途入社です。 毎朝1時間資格勉強継続中です。