カテゴリ: Flask 更新日: 2025/12/15

Flaskで多要素認証(2FA)を導入する基本ステップ解説!初心者でもわかるセキュリティ強化の仕組み

Flaskで多要素認証(2FA)を導入する基本ステップ解説
Flaskで多要素認証(2FA)を導入する基本ステップ解説

先生と生徒の会話形式で理解しよう

生徒

「先生、ログインのときにスマホに届く数字コードを入力する仕組みって、どうやって作るんですか?」

先生

「それは“多要素認証(2FA)”と呼ばれる仕組みですね。Flaskでも簡単に導入できますよ。」

生徒

「多要素認証って、パスワードと何が違うんですか?」

先生

「いい質問ですね。パスワードは“知っている情報”ですが、2FAはそれに加えて“持っているもの”も使うんです。たとえば、スマートフォンで受け取る認証コードなどですね。」

生徒

「なるほど!それなら不正ログインが減りそうですね。Flaskでどう作るのか教えてください!」

1. 多要素認証(2FA)とは?

1. 多要素認証(2FA)とは?
1. 多要素認証(2FA)とは?

多要素認証(Two-Factor Authentication, 2FA)とは、ログイン時に2つ以上の要素を使って本人確認を行う仕組みのことです。1つ目はパスワード、2つ目はスマートフォンのアプリやSMSで受け取る認証コードなどです。

もしパスワードが盗まれても、認証コードがなければログインできません。これによってセキュリティが大幅に強化されます。銀行のネットバンキングやSNSなどでも一般的に使われている仕組みです。

2. Flaskで2FAを導入する基本の流れ

2. Flaskで2FAを導入する基本の流れ
2. Flaskで2FAを導入する基本の流れ

Flaskで2FAを実装する基本ステップは次の4つです。

  1. ユーザー登録時に2FAの設定を有効化
  2. ログイン後に認証コードを生成
  3. ユーザーのスマホアプリ(Google Authenticatorなど)でコードを確認
  4. 入力されたコードをFlaskで検証

ここでは、Pythonの人気ライブラリPyOTPを使って、TOTP(時間ベースのワンタイムパスワード)を生成します。

3. PyOTPを使ってTOTPを作ってみよう

3. 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コードを表示して連携

4. Google AuthenticatorでQRコードを表示して連携
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. 認証コードを確認する処理

5. 認証コードを確認する処理
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の導入手順まとめ

6. Flaskでの2FAの導入手順まとめ
6. Flaskでの2FAの導入手順まとめ

多要素認証を導入することで、パスワード漏えいによる被害を大幅に減らすことができます。Flaskでは、以下のように段階を追って実装するのが基本です。

  • ユーザー登録時に秘密鍵を生成して保存
  • QRコードでGoogle Authenticatorと連携
  • ログイン時に6桁のワンタイムパスワードを入力
  • サーバー側でコードを検証してログインを完了

また、セキュリティをさらに高めるためには、ログイン試行回数の制限や、IPアドレスの監視なども組み合わせるとより安全になります。

7. 2FAを使うときの注意点

7. 2FAを使うときの注意点
7. 2FAを使うときの注意点

2FAを導入しても、すべてのリスクがなくなるわけではありません。たとえば、スマートフォンを紛失した場合には認証ができなくなります。そのため、次のような対策も考えておきましょう。

  • バックアップコードを発行しておく
  • 再設定用のメールアドレスを登録しておく
  • 信頼できる端末だけで認証を許可する設定を作る

これらを設定することで、初心者でも安心してFlaskアプリに2FAを導入できます。

8. Flaskで安全なログイン体験を実現しよう

8. Flaskで安全なログイン体験を実現しよう
8. Flaskで安全なログイン体験を実現しよう

Flaskでの多要素認証(2FA)は、初心者でも意外と簡単に導入できます。パスワードだけに頼らない認証方法を取り入れることで、アプリの信頼性がぐっと高まります。

セキュリティは「難しい技術」ではなく、「ユーザーを守る優しさ」です。まずは、今回紹介した基本の仕組みを理解し、Flaskで安全なログインシステムを構築してみましょう。

カテゴリの一覧へ
新着記事
New1
Flask
Flaskのログレベル(DEBUG/INFO/WARNING/ERROR)を使い分ける方法を完全ガイド!
New2
Python
Pythonのfrozensetとは?ミュータブルなsetとの違いをわかりやすく解説
New3
Python
Pythonでセットを活用してデータをフィルタリングする方法!初心者でもわかるセットの基本と使い方
New4
Python
Pythonの辞書操作まとめ!初心者が知っておくべき便利ワザ集
人気記事
No.1
Java&Spring記事人気No1
Python
Pythonの文字列から一部を抽出する方法!スライスを使った基本的な切り出し方
No.2
Java&Spring記事人気No2
Python
Pythonの文字列を1文字ずつ処理する方法!for文やlist化の活用例
No.3
Java&Spring記事人気No3
Flask
FlaskアプリのSECRET_KEYの設定方法を完全ガイド!初心者でもわかるセキュリティ対策
No.4
Java&Spring記事人気No4
Django
Djangoモデル入門|初心者が最初に知るべきORMの基本操作
No.5
Java&Spring記事人気No5
Flask
Flaskで非同期処理を成功させるベストプラクティス集|初心者でも失敗しない考え方
No.6
Java&Spring記事人気No6
Python
Pythonのリストを分割する方法を完全ガイド!初心者でもわかるスライス・split・itertoolsの使い方
No.7
Java&Spring記事人気No7
Flask
Flaskでデータベースを使う基本!SQLAlchemyの導入方法をやさしく解説
No.8
Java&Spring記事人気No8
Flask
Flaskのログをファイルに保存する方法!初心者でもわかる設定手順を徹底解説