Flaskで多要素認証(2FA)を導入する基本ステップ解説!初心者でもわかるセキュリティ強化の仕組み
生徒
「先生、ログインのときにスマホに届く数字コードを入力する仕組みって、どうやって作るんですか?」
先生
「それは“多要素認証(2FA)”と呼ばれる仕組みですね。Flaskでも簡単に導入できますよ。」
生徒
「多要素認証って、パスワードと何が違うんですか?」
先生
「いい質問ですね。パスワードは“知っている情報”ですが、2FAはそれに加えて“持っているもの”も使うんです。たとえば、スマートフォンで受け取る認証コードなどですね。」
生徒
「なるほど!それなら不正ログインが減りそうですね。Flaskでどう作るのか教えてください!」
1. 多要素認証(2FA)とは?
多要素認証(Two-Factor Authentication, 2FA)とは、ログイン時に2つ以上の要素を使って本人確認を行う仕組みのことです。1つ目はパスワード、2つ目はスマートフォンのアプリやSMSで受け取る認証コードなどです。
もしパスワードが盗まれても、認証コードがなければログインできません。これによってセキュリティが大幅に強化されます。銀行のネットバンキングやSNSなどでも一般的に使われている仕組みです。
2. Flaskで2FAを導入する基本の流れ
Flaskで2FAを実装する基本ステップは次の4つです。
- ユーザー登録時に2FAの設定を有効化
- ログイン後に認証コードを生成
- ユーザーのスマホアプリ(Google Authenticatorなど)でコードを確認
- 入力されたコードをFlaskで検証
ここでは、Pythonの人気ライブラリPyOTPを使って、TOTP(時間ベースのワンタイムパスワード)を生成します。
3. PyOTPを使ってTOTPを作ってみよう
まずは、PyOTPをインストールします。
pip install pyotp
次に、Flaskでワンタイムパスワードを生成して表示してみましょう。
import pyotp
from flask import Flask
app = Flask(__name__)
@app.route('/generate')
def generate_otp():
secret = pyotp.random_base32()
totp = pyotp.TOTP(secret)
code = totp.now()
return f"秘密鍵: {secret}、現在の認証コード: {code}"
このコードでは、random_base32()でランダムな秘密鍵(Secret Key)を作り、TOTP()で時間ごとに変わる認証コードを生成しています。
4. Google AuthenticatorでQRコードを表示して連携
ユーザーが自分のスマホにGoogle Authenticatorなどのアプリを使って登録できるようにするため、QRコードを表示します。
import pyotp, qrcode
from flask import Flask, Response
app = Flask(__name__)
@app.route('/qrcode')
def show_qr():
secret = pyotp.random_base32()
totp = pyotp.TOTP(secret)
uri = totp.provisioning_uri(name="user@example.com", issuer_name="MyFlaskApp")
img = qrcode.make(uri)
img.save("static/qrcode.png")
return Response(open("static/qrcode.png", "rb"), mimetype="image/png")
provisioning_uri()でGoogle Authenticator用のURIを作り、qrcodeライブラリで画像を生成しています。このQRコードをスマホでスキャンすると、自動で2FAが設定されます。
5. 認証コードを確認する処理
次に、ユーザーがスマホで表示された6桁のコードを入力し、それをFlask側で確認します。
from flask import Flask, request
import pyotp
app = Flask(__name__)
secret = "JBSWY3DPEHPK3PXP" # 登録時に保存した秘密鍵を使う
@app.route('/verify', methods=['POST'])
def verify_otp():
user_code = request.form['code']
totp = pyotp.TOTP(secret)
if totp.verify(user_code):
return "認証成功!ログイン完了です。"
else:
return "認証コードが違います。もう一度入力してください。"
verify()関数が、入力されたコードと現在の有効なコードを照合します。正しい場合のみログインを許可します。
6. Flaskでの2FAの導入手順まとめ
多要素認証を導入することで、パスワード漏えいによる被害を大幅に減らすことができます。Flaskでは、以下のように段階を追って実装するのが基本です。
- ユーザー登録時に秘密鍵を生成して保存
- QRコードでGoogle Authenticatorと連携
- ログイン時に6桁のワンタイムパスワードを入力
- サーバー側でコードを検証してログインを完了
また、セキュリティをさらに高めるためには、ログイン試行回数の制限や、IPアドレスの監視なども組み合わせるとより安全になります。
7. 2FAを使うときの注意点
2FAを導入しても、すべてのリスクがなくなるわけではありません。たとえば、スマートフォンを紛失した場合には認証ができなくなります。そのため、次のような対策も考えておきましょう。
- バックアップコードを発行しておく
- 再設定用のメールアドレスを登録しておく
- 信頼できる端末だけで認証を許可する設定を作る
これらを設定することで、初心者でも安心してFlaskアプリに2FAを導入できます。
8. Flaskで安全なログイン体験を実現しよう
Flaskでの多要素認証(2FA)は、初心者でも意外と簡単に導入できます。パスワードだけに頼らない認証方法を取り入れることで、アプリの信頼性がぐっと高まります。
セキュリティは「難しい技術」ではなく、「ユーザーを守る優しさ」です。まずは、今回紹介した基本の仕組みを理解し、Flaskで安全なログインシステムを構築してみましょう。