jiku log

データサイエンスの核心を掴む : 学びと発見の記録

「PythonでつくるWebアプリのつくり方」を読む ~Chap.3 Webフレームワークとデータベース ②ログイン機能 ~

02 掲示板アプリにログイン機能を追加しよう

要点

ログイン機能の役割

ログイン機能の役割には,以下のようなものがある。

  • ユーザ識別 : アプリがユーザを識別することにより,ユーザに合わせた情報を表示する。
  • アクセス制御 : ユーザごとに,アクセスしてよい情報や実行してよい処理を限定させる。
  • セキュリティ : ユーザの情報を守り,また悪意があるユーザがアプリにアクセスすることを防ぐ。
  • 追跡 : ユーザごとの行動ログを記録し,利用状況の分析を可能にする。
ログイン機能の実現方法
  • 認証機能 :
    • 登録されているユーザが,正しく自分のアカウントにログインできるようにする。
    • 基本的な認証方法は,ユーザIDとパスワードによる認証である。
    • セキュリティを向上させるために,2要素認証やパスキー認証などがある。
  • セッション管理 :
    • ログインしているユーザの状態を維持する仕組みである。
    • クライアント(Webブラウザなど)とサーバの間で,CookiやJWTを用いてセッションキーを送受信して,同じセッション情報を扱えるようにする。

本節の気付き

本節で紹介している,ログイン機能に関するサンプルコードの内容を,機能ごとに確認した。

基本モジュールのインポートと初期設定

最初に,基本モジュールのインポートと初期設定を行なっている。

from datetime import datetime

from flask import Flask, render_template, request, redirect, url_for
from flask_sqlalchemy import SQLAlchemy 
# Flask-Loginのインポート --- (※1)
from flask_login import LoginManager, UserMixin, login_user, current_user, logout_user
from werkzeug.security import generate_password_hash, check_password_hash
import os

ログインを実現するために,Flask-Loginをインポートしている。またパスワードのハッシュ化にwerkzeug.securityを使用している。

ログインマネージャーの設定

init_appを実行するためには,SECRET_KEYとして十分な長さの文字列を設定する必要があるが,この文字列を設定するためにos.urandomを用いている。

ユーザモデルの作成
  • Userクラス : ログイン情報(ユーザー名とパスワード)を保持する。
  • Messageクラス : ユーザー名とメッセージ内容を保持する。
ユーザーを読み込むためのコールバック

セッションからのユーザーIDを使って,DB(ユーザテーブル)からユーザー情報を取得するための関数(コールバック)を実装している。

ログインユーザー名を保持する変数

毎回のリクエストの前に,ログイン済みユーザーの名前をglobal変数に設定している。ここで設定されているlogin_user_nameには,セッション中のログインユーザ情報が保持されている。

アカウント登録

アカウント登録(サインアップ)においては,Userのインスタンスを作る。
なお,GETメソッドとPOSTメソッドが定義されているが,内容は以下の通りである。

  • GET : サインアップページを表示する。
  • POST : 入力された情報からユーザーを作成し,DBに保存後ログインページへリダイレクトする。
ログイン

GETメソッドとPOSTメソッドが定義されているが,内容は以下の通りである。

  • GET : ログインページを表示する。
  • POST : 入力されたユーザー名・パスワードが正しければログインしてトップページへリダイレクトする。
ログアウト

ログアウト処理を行ない,トップページへリダイレクトする。

エラーハンドリング

試しに,登録されていないユーザ名でログインを試みた。その結果,以下のような画面が表示された。

存在しないアカウントによるログイン

エラー画面

この内容は,Flask内のエラーハンドリング画面であった。実際の開発では,エラーケースを想定してエラーハンドリングを実装する,例えば今回の場合では,「ユーザ名が登録されていない」といったメッセージを出す必要がある。

なお,事前に正しくアカウント登録ができてれば,上記のようなエラーメッセージは表示されなかった。

まとめと感想

今回は,「chapter3 Webフレームワークとデータベース」における,ログイン機能についてまとめた。

ログイン機能を持っておくべき理由や,ログイン機能が持つべき機能要素について理解することができた。今回の例は,かなりシンプルに設計しているので,ログインはかなり手軽にできているが,決済などが関係するシステムではセキュリティをより厳重にして情報管理をする必要があると考えるので,これらの方法については今後学んでいきたい。

またエラーハンドリングについて,デフォルトでのFlaskのエラー画面を確認したが,ユーザにとってはぎょっとする画面だと思われるので,例外処理などについてもしっかり実装できるようになりたい。想定される代表的なエラーケースについては,生成AIに確認すれば提示されそうなので,こちらも試してみたい。


本記事を最後まで読んでくださり,どうもありがとうございました。