Pythonを使ったログイン機能の作り方7選! – Japanシーモア

Pythonを使ったログイン機能の作り方7選!

Pythonを使ったログイン機能の作り方の詳細ガイドのイメージPython
この記事は約18分で読めます。

 

【サイト内のコードはご自由に個人利用・商用利用いただけます】

このサービスは複数のSSPによる協力の下、運営されています。

この記事では、プログラムの基礎知識を前提に話を進めています。

説明のためのコードや、サンプルコードもありますので、もちろん初心者でも理解できるように表現してあります。

基本的な知識があればカスタムコードを使って機能追加、目的を達成できるように作ってあります。

※この記事は、一般的にプロフェッショナルの指標とされる『実務経験10,000時間以上』を凌駕する現役のプログラマチームによって監修されています。

サイト内のコードを共有する場合は、参照元として引用して下さいますと幸いです

※Japanシーモアは、常に解説内容のわかりやすさや記事の品質に注力しております。不具合、分かりにくい説明や不適切な表現、動かないコードなど気になることがございましたら、記事の品質向上の為にお問い合わせフォームにてご共有いただけますと幸いです。
(送信された情報は、プライバシーポリシーのもと、厳正に取扱い、処分させていただきます。)

はじめに

Pythonは汎用性の高さから、Webアプリケーション開発からデータ分析まで、多岐に渡るシーンで利用されています。

その中でも、今回はWebアプリケーションで必須となる「ログイン機能」の作り方をPythonを用いて7つのステップで学んでいきます。

●Pythonとは

Pythonは、可読性と簡易性を重視したプログラミング言語で、初心者にとって学びやすい言語の一つです。

その特徴として、構文が直感的であること、ライブラリが豊富であることなどが挙げられます。

Webアプリケーションの開発では、フレームワークのDjangoやFlaskが用いられ、その中でログイン機能の実装が可能となっています。

●ログイン機能とは

ログイン機能とは、Webアプリケーションの利用者が自身をシステムに認証し、特定のサービスを利用できるようにするための機能です。

具体的には、ユーザー名とパスワードの情報を入力し、その情報がデータベースに登録されているものと一致することを確認します。

これにより、各ユーザーは自身のアカウントだけの情報やサービスを安全に利用できます。

●Pythonでログイン機能を作るための準備

Pythonでログイン機能を作るためには、まずPythonの基本的な文法を理解することが必要です。

その上で、PythonのWebフレームワークであるDjangoやFlaskの基本操作を覚えると良いでしょう。

また、データベースの操作にも慣れておくと、スムーズに開発を進めることができます。

●Pythonでログイン機能を作るステップ

それでは、Pythonでログイン機能を作るためのステップを詳しく見ていきましょう。

○ステップ1:ユーザー登録機能の作成

ログイン機能を作るためには、まずユーザーが自身の情報をシステムに登録する機能が必要です。

ユーザーが自分のユーザー名とパスワードを登録し、それらの情報がデータベースに保存されます。

このユーザー情報は、後のログイン認証時に利用されます。

□サンプルコード1:ユーザー登録機能

このコードではFlaskを使ってユーザー登録機能を作成しています。

この例では、ユーザーから入力されたユーザー名とパスワードをデータベースに保存しています。

from flask import Flask, request
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:////tmp/test.db'
db = SQLAlchemy(app)

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=True)
    password = db.Column(db.String(120))

@app.route('/register', methods=['POST'])
def register():
    username = request.form['username']
    password = request.form['password']
    new_user = User(username=username, password=password)
    db.session.add(new_user)
    db.session.commit()
    return 'Registered successfully'

このコードは、まずFlaskとSQLAlchemyをインポートし、Flaskアプリケーションとデータベースを設定します。

そして、ユーザー情報を保持するUserというクラスを定義します。

このクラスでは、ユーザーのID、ユーザー名、パスワードをデータベースのカラムとして設定しています。

次に/registerエンドポイントをPOSTメソッドで定義します。

このエンドポイントにPOSTリクエストが送られたとき、フォームからユーザー名とパスワードを受け取り、その情報を用いて新たなUserオブジェクトを作成します。

そして、そのUserオブジェクトをデータベースに追加し、変更をコミットします。

これにより、新たなユーザーがデータベースに登録されることになります。

このコードを実行すると、/registerへのPOSTリクエストによってユーザーの登録が行われ、’Registered successfully’というメッセージがレスポンスとして返されます。

なお、このコードではパスワードを平文で保存していますが、セキュリティ上の観点からパスワードはハッシュ化して保存することが推奨されます。

その方法についてはステップ2で説明します。

○ステップ2:パスワードのハッシュ化

パスワードのハッシュ化は、セキュリティを保つための重要なステップです。

ハッシュ化とは、元の情報から一定のルールに従って計算された値を生成することで、この値は元の情報から容易に逆算することができないため、パスワードのような秘密情報の保護に有効です。

□サンプルコード2:パスワードのハッシュ化

このコードではPythonのハッシュ化ライブラリであるbcryptを使ってパスワードをハッシュ化するコードを紹介しています。

この例では、新たなユーザーが登録される際にそのパスワードをハッシュ化してデータベースに保存しています。

import bcrypt
from flask import Flask, request
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:////tmp/test.db'
db = SQLAlchemy(app)

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=True)
    password = db.Column(db.String(120))

@app.route('/register', methods=['POST'])
def register():
    username = request.form['username']
    password = request.form['password']
    hashed_password = bcrypt.hashpw(password.encode('utf-8'), bcrypt.gensalt())
    new_user = User(username=username, password=hashed_password)
    db.session.add(new_user)
    db.session.commit()
    return 'Registered successfully'

このコードでは、前述のユーザー登録機能に加えてbcryptをインポートし、パスワードをハッシュ化する処理を加えています。

具体的には、パスワードをUTF-8でエンコードした後、bcryptのhashpw関数でハッシュ化しています。

そしてそのハッシュ化したパスワードをデータベースに保存します。

このコードを実行すると、新たに登録されるユーザーのパスワードはハッシュ化されてデータベースに保存されます。

これにより、もしデータベースの情報が第三者に漏れたとしても、ハッシュ化されたパスワードから元のパスワードを取り出すことは非常に難しくなります。

○ステップ3:ログイン認証機能の作成

ユーザーが登録され、その情報がハッシュ化されてデータベースに保存された後、次に必要となるのがログイン認証機能です。

ユーザーがログインする際にユーザー名とパスワードを入力し、その情報がデータベースに保存されている情報と一致するかを確認します。

□サンプルコード3:ログイン認証機能

このコードではログイン認証機能を作成しています。

この例では、ユーザーから入力されたユーザー名とパスワードをデータベースの情報と照合し、ログインを認証しています。

@app.route('/login', methods=['POST'])
def login():
    username = request.form['username']
    password = request.form['password']
    user = User.query.filter_by(username=username).first()
    if user and bcrypt.checkpw(password.encode('utf-8'), user.password):
        return 'Login successful'
    else:
        return 'Invalid username or password'

このコードでは/loginエンドポイントをPOSTメソッドで定義しています。

このエンドポイントにPOSTリクエストが送られたとき、まずフォームからユーザー名とパスワードを受け取ります。

次にデータベースからユーザー名が一致するユーザーを取得し、取得できたユーザーのパスワードと入力されたパスワードをbcryptのcheckpw関数で照合します。

照合に成功した場合は’Login successful’を、失敗した場合は’Invalid username or password’を返します。

このコードを実行すると、/loginへのPOSTリクエストによってログインの認証が行われ、認証が成功すれば’Login successful’、失敗すれば’Invalid username or password’というメッセージがレスポンスとして返されます。

以上で、Pythonを使ったログイン機能の基本的な部分は完成です。し

かし、まだユーザーがログインしたままであることをシステムが記憶するためのセッション管理や、セキュリティ対策など、必要な要素が残っています。

それらについては次のステップで説明します。

○ステップ4:ログアウト機能の作成

ログイン機能が完成したら、次にログアウト機能を作成します。

ログアウト機能により、ユーザーは自分がログイン状態であるセッションを終了させることができます。

□サンプルコード4:ログアウト機能

このコードではログアウト機能を作成しています。

この例では、セッションからユーザー情報を削除することでログアウトを実現しています。

from flask import session

@app.route('/logout')
def logout():
    session.pop('username', None)
    return 'Logged out'

このコードでは/logoutエンドポイントを定義し、その中でFlaskのsessionオブジェクトからユーザー名を削除しています。

これにより、現在のセッションからユーザー情報が削除され、ユーザーはログアウト状態となります。

このコードを実行すると、/logoutへのGETリクエストによってログアウトが行われ、’Logged out’というメッセージがレスポンスとして返されます。

しかし、現状ではセッションを管理する機能がまだ実装されていません。次のステップではそのための準備を行います。

○ステップ5:セッション管理の実装

Webアプリケーションでは、ユーザーがログインしたままであることをシステムが記憶するためにセッションを使います。

セッションはサーバー上に一時的に保存される情報で、各ユーザーに対して一意のセッションIDが付与されます。

このセッションIDを利用して、サーバーはユーザーがログイン状態であることを維持します。

□サンプルコード5:セッション管理

このコードではFlaskのセッション機能を使ってセッション管理を行うコードを紹介しています。

この例では、ユーザーがログイン認証に成功したときにセッションにユーザー名を保存し、ログアウトするときにセッションからユーザー名を削除しています。

@app.route('/login', methods=['POST'])
def login():
    username = request.form['username']
    password = request.form['password']
    user = User.query.filter_by(username=username).first()
    if user and bcrypt.checkpw(password.encode('utf-8'), user.password):
        session['username'] = username
        return 'Login successful'
    else:
        return 'Invalid username or password'

このコードでは、/loginへのPOSTリクエストで、認証に成功した場合、セッションにユーザー名を保存します。

具体的には、session[‘username’] = usernameと記述することでセッションにユーザー名を保存しています。

これにより、ユーザーがログイン状態であることがシステムに記憶されます。

このコードを実行すると、ユーザーがログイン認証に成功するとセッションにユーザー名が保存され、ログアウトするときにセッションからユーザー名が削除されます。

これにより、ユーザーがログイン状態であることをシステムが記憶し続けることができます。

○ステップ6:ログイン状態の維持

セッション管理を行うことで、ユーザーがログイン状態であることをシステムが記憶することができます。

しかし、ログイン状態を維持するためには、セッションの有効期限管理や、セッションIDの管理などが必要となります。

このような機能はFlaskではデフォルトで提供されていますが、安全な運用を行うためには、適切な設定が必要です。

具体的には、Flaskの設定項目であるSESSION_PERMANENTやSESSION_COOKIE_SECUREなどを適切に設定する必要があります。

セッションの有効期限やセッションIDの管理についての詳細な説明は、Flaskの公式ドキュメンテーションを参照してください。

□サンプルコード6:ログイン状態の維持

このコードではセッションの有効期限とセキュアなセッションIDの設定を行うコードを紹介しています。

この例では、セッションの有効期限を30分に設定し、セッションIDの送信にはHTTPSを使用する設定を行っています。

from datetime import timedelta

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:////tmp/test.db'
app.config['SESSION_PERMANENT'] = True
app.config['PERMANENT_SESSION_LIFETIME'] = timedelta(minutes=30)
app.config['SESSION_COOKIE_SECURE'] = True
db = SQLAlchemy(app)

このコードでは、Flaskの設定項目であるSESSION_PERMANENTをTrueに設定し、PERMANENT_SESSION_LIFETIMEをtimedeltaで30分に設定しています。

これにより、セッションの有効期限が30分に設定されます。

また、SESSION_COOKIE_SECUREをTrueに設定することで、セッションIDの送信にはHTTPSが使用されます。

このコードを実行すると、セッションの有効期限が30分に設定され、セッションIDの送信にはHTTPSが使用されるようになります。

これにより、ログイン状態の維持と安全な運用が可能となります。

○ステップ7:セキュリティ対策

ウェブアプリケーションの開発では、セキュリティ対策は必須です。

パスワードの安全な取り扱い、セッションの管理、データの暗号化など、さまざまな対策が存在しますが、ここでは特にパスワードのハッシュ化について取り上げます。

ハッシュ化とは、データを一定の長さの文字列に変換する技術で、パスワードを直接保存する代わりにハッシュ化した値を保存します。

これにより、万一データベースが漏洩したとしても、パスワードが直接漏れるリスクを軽減できます。

Pythonでは「bcrypt」というライブラリを使用してパスワードのハッシュ化を行うことができます。

また、Flaskではセッション管理のために、秘密鍵(Secret Key)を設定することが推奨されています。

□サンプルコード7:セキュリティ対策

from flask import Flask, request, session
from flask_sqlalchemy import SQLAlchemy
from flask_bcrypt import Bcrypt
import os

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:////tmp/test.db'
app.config['SECRET_KEY'] = os.urandom(24)
db = SQLAlchemy(app)
bcrypt = Bcrypt(app)

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=True, nullable=False)
    password = db.Column(db.String(120), nullable=False)

@app.route('/register', methods=['POST'])
def register():
    username = request.form['username']
    password = request.form['password']
    hashed_password = bcrypt.generate_password_hash(password).decode('utf-8')
    new_user = User(username=username, password=hashed_password)
    db.session.add(new_user)
    db.session.commit()
    return 'Registered successfully'

@app.route('/login', methods=['POST'])
def login():
    username = request.form['username']
    password = request.form['password']
    user = User.query.filter_by(username=username).first()
    if user and bcrypt.check_password_hash(user.password, password):
        session['username'] = username
        return 'Login successful'
    else:
        return 'Invalid username or password'

このコードでは、パスワードのハッシュ化と秘密鍵の設定を行っています。

まず、「bcrypt」ライブラリを使用して、パスワードをハッシュ化しています。

具体的には、bcrypt.generate_password_hash(password)でパスワードをハッシュ化し、その結果をデータベースに保存します。

また、ログイン時には、bcrypt.check_password_hash()関数を使用して、入力されたパスワードとハッシュ化されたパスワードを比較します。

そして、Flaskの設定項目app.config['SECRET_KEY']にランダムな文字列を設定しています。

この秘密鍵は、Flaskのセッションを安全に保つために使用されます。

os.urandom(24)は24バイトのランダムなバイト列を生成します。

このコードを実行すると、ユーザーが新規登録する際にパスワードがハッシュ化されて保存され、ログイン時にはハッシュ化されたパスワードと入力されたパスワードが正しく一致するかが確認されます。

また、Flaskのセッション管理は秘密鍵によって安全に行われます。

●注意点と対処法

ハッシュ化されたパスワードは元のパスワードに戻すことができませんので、ユーザーがパスワードを忘れた場合、新たにパスワードを設定し直す流れが必要になります。

そのため、「パスワードを忘れた場合」のための処理をアプリケーションに組み込むことも重要です。

また、Flaskの秘密鍵はアプリケーションのセキュリティに深く関わる重要な要素です。

そのため、実際の運用環境では、この値が第三者に漏洩しないように管理することが重要です。

●カスタマイズ方法

上述したサンプルコードは基本的なログイン機能の一部を実装したものですが、これに機能を追加することでさまざまなカスタマイズが可能です。

例えば、ユーザーがログイン状態であるかどうかを確認するデコレータを作成し、ログインが必要なページに対して適用することができます。

これにより、ログインしていないユーザーがログインが必要なページにアクセスした場合にログインページにリダイレクトするなどの処理を共通化することができます。

また、ユーザーによるパスワードの変更機能や、パスワードを忘れた場合のパスワード再設定機能なども必要に応じて追加することができます。

まとめ

PythonとFlaskを用いてログイン機能を実装する方法について7つのステップで解説しました。

基本的なログイン機能から、データベースとの連携、セキュリティ対策まで、初心者からでも理解できる内容となっています。

この知識をベースに、自分だけのウェブアプリケーションを作成し、さらにカスタマイズを加えていくと良いでしょう。

Pythonの強力なライブラリとFlaskの柔軟性を最大限に活用して、セキュアなウェブアプリケーションの開発に挑戦してみてください。