2025年1月20日月曜日

MFA totp django-otp

 


Djangoでdjango-otpを使用して新たにQRコードを生成し、二要素認証を実装する方法について説明します。


1. 必要なパッケージのインストール

まず、以下のパッケージをインストールします。


bash

コピーする

編集する

pip install django-otp qrcode[pil]

django-otpはワンタイムパスワードのサポートを追加し、qrcodeはQRコードの生成に使用します。


2. Djangoプロジェクトの設定

settings.pyにdjango_otpとdjango_otp.plugins.otp_totpを追加します。


python

コピーする

編集する

INSTALLED_APPS = [

    # 既存のアプリケーション

    'django_otp',

    'django_otp.plugins.otp_totp',

]

これにより、TOTP(Time-based One-Time Password)のサポートが有効になります。


3. モデルの作成

ユーザーごとにTOTPデバイスを管理するため、TOTPDeviceモデルを作成します。


python

コピーする

編集する

from django_otp.plugins.otp_totp.models import TOTPDevice


# ユーザーに関連付けられたTOTPデバイスを作成

device = TOTPDevice.objects.create(user=user)

TOTPDeviceは、ユーザーごとに一意のシークレットキーを生成し、QRコードの生成に使用されます。


4. QRコードの生成

qrcodeライブラリを使用して、生成されたシークレットキーからQRコードを作成します。


python

コピーする

編集する

import qrcode

from io import BytesIO

from base64 import b64encode


# デバイスの設定URLを取得

config_url = device.config_url


# QRコードを生成

qr = qrcode.QRCode()

qr.add_data(config_url)

qr.make(fit=True)


# 画像をメモリに保存

img = qr.make_image(fill='black', back_color='white')

buffer = BytesIO()

img.save(buffer, format='PNG')

buffer.seek(0)


# 画像をBase64でエンコード

img_str = b64encode(buffer.getvalue()).decode()

このコードにより、QRコードの画像データがBase64形式でエンコードされ、テンプレートで表示可能になります。


5. テンプレートでの表示

生成したQRコードをテンプレートで表示するには、以下のようにします。


html

コピーする

編集する

<img src="data:image/png;base64,{{ img_str }}" alt="QR Code">

これにより、ユーザーはQRコードをスキャンして認証アプリに追加できます。


6. 認証の検証

ユーザーが認証アプリで生成したトークンを入力した際に、それを検証する必要があります。


python

コピーする

編集する

# ユーザーのデバイスを取得

device = TOTPDevice.objects.get(user=user)


# トークンの検証

if device.verify_token(token):

    # 認証成功

    ...

else:

    # 認証失敗

    ...

verify_tokenメソッドは、ユーザーが入力したトークンが正しいかどうかを確認します。


参考資料

Django OTP TOTP - how to display QR code in template

django-otp 公式ドキュメント

Djangoで、二要素認証を、Google認証システムを使って実装。

pyotpでワンタイムパスワードを試してみる

Custom Two-factor with Qrcode in django

【Django】django-otpで多要素認証(二要素認証)を実現させる

0 件のコメント:

コメントを投稿

SQLインジェクション検証

' OR '1'='1 ' OR '1'='1' -- ' UNION SELECT null, null, user, password FROM users -- '; WAITFOR D...