【AWS Cognito】アプリにログイン認証機能を実装!Cognito&Flaskで始める認証入門

開発

「Webアプリにログイン機能をつけたいけど、セキュリティとかユーザー管理って大変そう…」

そんな悩みを抱えているあなたに朗報です!PythonとAWS Cognitoを組み合わせれば、驚くほど簡単に、そしてセキュアな認証システムをあなたのWebアプリに組み込めます。今回は、VScodeを使ってPythonで認証アプリを作成する手順を、実際のコードを交えながら徹底解説していきます。

ログインボタンをクリックすると、Cognitoのサインイン画面が表示され、ログイン成功後には成功画面が表示されるアプリを目指します。

今回作成するアプリ

今回作成するのは、ログイン機能付きのシンプルなWebアプリです。ユーザーが「ログイン」ボタンをクリックすると、AWS Cognitoが用意するログイン画面(Hosted UI)にリダイレクトされ、そこで認証を行います。ログインに成功すると、自動的にアプリに戻り、ユーザー名が表示される「ログイン成功画面」が表示される流れになっています。

アプリの構成はとてもシンプルですが、実際の現場で使われるOAuth2.0 / OpenID Connectの仕組みをしっかり体験できるようになっているのがポイントです。

ログイン・ログアウトの動きや、ユーザー情報の取得処理など、本格的なWebアプリに必要な「認証の基礎」が詰まった内容になっているので、初めてCognitoに触れる方でもしっかりと理解できるはずです。

下記の画面で、ログインボタンをクリックします。

Cognitoのサインイン画面が表示されます。

Screenshot

認証に成功すると、ログイン成功画面が表示されます。

このアプリを作成する手順を解説します。

今回のアプリは、VScodeを使ってPythonで記述します。

Cognitoは、Python以外に下記の画像内の言語に対応しています。

Cognitoとは?

Cognito(コグニート)は、AWS(Amazon Web Services)が提供するユーザー認証と管理のためのサービスです。
ログイン機能の実装には、ユーザー情報の登録・認証・パスワード管理・セキュリティ対策など多くの手間がかかりますが、Cognitoを使えばこれらをすべて自動で行えます。

特に注目すべきは、セキュリティが強固で、OAuth2.0 / OpenID Connect に対応している点です。GoogleやFacebookとのログイン連携(ソーシャルログイン)も簡単に設定できます。

プログラムを書く手間を最小限に抑えつつ、安心・安全なログイン機能を導入したいなら、Cognitoは最適な選択です。

AWSマネジメントコンソールでCognitoの「ユーザープール」を作成

AWSマネジメントコンソールにログインし、Cognitoサービスにアクセスします。

ユーザープールを作成」をクリックし、画面の案内に従って設定を進めてください。

Screenshot

アプリケーションクライアントの作成

ユーザープールを作成したら、「アプリケーションクライアント」を作成します。

Screenshot

設定項目

「AIT-Python-LoginApp」という名前のクライアントを作成し、「Quick Setup ガイド」から「Python」を選択してください。(環境に合わせて変更してください。)

Screenshot

Quick Setup ガイドの下に、作業を行うべき内容①、②と記載されているので、その手順に沿って設定を行っていきます。

1. コールバックURLやスコープを設定する

CognitoとPythonアプリを正しく連携させるためには、いくつかの設定が必要です。

主に次の3つの項目を設定していきます。

項目説明
許可されたコールバック URLログイン成功後、Cognito からリダイレクトされる先。例:http://localhost:5050/authorize
ログアウト URLログアウト後の戻り先 URL(今回は設定しない)例:http://localhost:5050/
スコープユーザー情報に何を含めるか。例:openid profile email

まずは、Cognitoのアプリケーションクライアント設定画面で「ログインページ」のタブを開きます。

マネージドログインページの設定の「編集」ボタンをクリックします。

スコープの選択

今回のアプリでは、電話番号を使った認証は行わないため、電話連絡以外(email、openid、profile)にチェックを入れてください。

スコープ名説明
phone電話番号が必要なら選択。SMS認証やMFAを行うときは必須
emailユーザーのメールアドレスを取得するために必要(email verificationにも使える)
openidOpenID Connect 認証に必須(これがないとIDトークンが発行されません)
aws.cognito.signin.user.adminCognito APIを使ってユーザー管理する際に必要(普通のログインだけであれば不要)
profilepreferred_usernamename(ユーザー名)など、プロフィール情報を利用した認証を行う

その他、必要な設定がある場合は任意で設定を変更してください。

すべてのチェックが完了したら、「変更を保存」をクリックしましょう。

これで、Cognitoがログイン後にアプリへ正しく情報を渡してくれるようになります。

さらに、設定が必要な項目がある場合は、用途に応じて追加・変更しておくとよいでしょう。

2. ライブラリのインストール

PythonでCognitoと連携するには、以下のコマンドでライブラリをインストールします。

pip install authlib werkzeug flask requests

各ライブラリの役割:

  • authlib: OAuth2 / OpenID Connect 対応の認証処理を簡単に
  • flask: 軽量なWebフレームワーク
  • requests: HTTP通信ライブラリ
  • werkzeug: Flask内部で使用される補助ライブラリ

3. authlib の OAuth 設定

いよいよPythonコードを書いていきましょう。プロジェクトフォルダ内に app.py というファイルを作成し、以下のコードを記述してください。

以降の手順7まで、すべてapp.py内に記述します。

まずは、③のコードをコピペします。

ポイント

13行目の <client secret> は、アプリケーションクライアントに関する情報に記載されている

クライアントシークレットから取得してください。

4. index() ルート

AWSマネジメントコンソールに記載の内容とは異なりますが、ログインした際にメールアドレスではなく、名前を出力させるために以下のようにコードを書きます。

@app.route('/')
def index():
    user = session.get('user')
    if user:
        username = user.get('preferred_username') or user.get('cognito:username') or 'ユーザー'
        return f"<h2>ログイン成功です!</h2><p>こんにちは、{username} さん。</p><a href='/logout'>ログアウト</a>"
    return 'ようこそ!<a href="/login">ログイン</a>'

5. login() ルート(Cognito Hosted UI にリダイレクト)

Cognitoのログイン画面へリダイレクトさせるためのコードを書きます。

@app.route('/login')
def login():
    nonce = generate_token()
    session['nonce'] = nonce
    redirect_uri = url_for('authorize', _external=True)
    return oauth.oidc.authorize_redirect(redirect_uri, nonce=nonce)
  • Hosted UI にユーザーを転送(ログイン画面)
  • ログイン後、Cognito が自動で /authorize に戻す

authorize_redirect() に渡すURLは、**Cognito アプリ設定に登録した「コールバック URL」**と一致している必要があります。


6. authorize() ルート(トークン受け取りとユーザー情報取得)

Cognitoからトークンを受け取り、ユーザー情報を取得してセッションに保存するためのコードです。

@app.route('/authorize')
def authorize():
    token = oauth.oidc.authorize_access_token()
    nonce = session.get('nonce')
    userinfo = oauth.oidc.parse_id_token(token, nonce=nonce)
    session['user'] = userinfo
    return redirect(url_for('index'))

🔄 処理の流れ:

  1. Cognito が /authorize に認証コードを渡す
  2. authorize_access_token() がこのコードを使ってアクセストークン・IDトークンを取得
  3. userinfo エンドポイントからメールアドレスなどのユーザー情報を取得
  4. セッションにユーザー情報を保存

7. logout() ルート(セッション削除)

セッション情報を削除してログアウトさせるコードです。

@app.route('/logout')
def logout():
    session.pop('user', None)
    return redirect(url_for('index'))

8. Flaskアプリの起動コード

Flaskアプリケーションを「実際に起動」するためのとても重要なコードです。

if __name__ == '__main__':
    app.run(host='localhost', port=5050)

このPythonファイルが直接実行されたときだけ、Flaskアプリをローカル環境(localhost)でポート5050番を使って起動するという意味のコードです。

Pythonアプリケーションを起動

いよいよ最終ステップです!VS Codeのターミナルで app.py があるディレクトリに移動し、以下のコマンドを実行します。

python app.py

ターミナルに以下のような出力があれば成功です!

アプリケーションの挙動確認

こちらのURLをブラウザで開きます。

http://localhost:5050/

「ようこそ!ログイン」と表示されたら、アプリが正常に立ち上がっています。「ログイン」をクリックすると、Cognitoのサインイン画面が表示されるはずです。

ようこそ!ログインと出ればアプリが正常に立ち上がっています。

ログインをクリックすると、下記のようにCognitoのサインイン画面が表示されます。

サインインに成功すると、ユーザー名付きの「ログイン成功画面」が表示されます

まとめ

AWS CognitoとPython(Flask)を使えば、短時間でセキュアなログイン機能を構築できます。ユーザー管理の仕組みも一元化でき、運用が非常に楽になるのが最大のメリットです。

開発や学習を始めたばかりの方でも、今回の手順を参考にすれば確実に動くものが作れますので、ぜひ挑戦してみてください!

プロフィール
TanaT

株式会社あいてぃ所属。
クラウドエンジニア(AWS・Azure)
取得資格:AWS SAP、AZ-104、AZ-305
フロントエンド、バックエンド開発もできるフルスタックエンジニアとして学習中。
「AIとクラウドについて学ぶ」サイトの編集長。

TanaTをフォローする
開発
シェアする
タイトルとURLをコピーしました