2024年9月20日金曜日

Flask でベーシック認証を実装する方法

Flask でベーシック認証を実装する方法

概要

特にライブラリを使わずに実装する方法を紹介します

環境

  • macOS 14.6.1
  • Python 3.11.10
  • Flask 3.0.3

デコレータを使う方法

from flask import Flask, Response, request

app = Flask(__name__)

# 認証情報(ユーザー名とパスワードをハードコーディング)
USERNAME = "admin"
PASSWORD = "password"


# 認証を行う関数
def check_auth(username, password):
    """ユーザー名とパスワードをチェックする"""
    return username == USERNAME and password == PASSWORD


# 認証を要求するレスポンスを返す関数
def authenticate():
    """認証を要求するレスポンスを返す"""
    return Response(
        "Could not verify your access level for that URL.\n"
        "You have to login with proper credentials",
        401,
        {"WWW-Authenticate": 'Basic realm="Login Required"'},
    )


# 認証のデコレーター
def requires_auth(f):
    """エンドポイントに認証を要求するデコレーター"""

    def decorated(*args, **kwargs):
        auth = request.authorization
        if not auth or not check_auth(auth.username, auth.password):
            return authenticate()
        return f(*args, **kwargs)

    return decorated


@app.route("/")
@requires_auth
def index():
    return "Hello, you are authenticated!"


if __name__ == "__main__":
    app.run(debug=True)

before_request を使ってすべてのルーティングに適用する方法

from flask import Flask, Response, request

app = Flask(__name__)

# 認証情報
USERNAME = "admin"
PASSWORD = "password"


# 認証をチェックする関数
def check_auth(username, password):
    return username == USERNAME and password == PASSWORD


# 認証が必要な場合にダイアログを表示する関数
def authenticate():
    return Response(
        "Could not verify your access level for that URL.\n"
        "You have to login with proper credentials",
        401,
        {"WWW-Authenticate": 'Basic realm="Login Required"'},
    )


# すべてのリクエストの前に認証を行う
@app.before_request
def before_request():
    if request.path == "/public":
        return  # 認証をスキップ
    auth = request.authorization
    if not auth or not check_auth(auth.username, auth.password):
        return authenticate()


# サンプルのルート
@app.route("/")
def index():
    return "Hello, you are authenticated!"


@app.route("/dashboard")
def dashboard():
    return "Welcome to your dashboard!"


if __name__ == "__main__":
    app.run(debug=True)

最後に

ライブラリを使う場合は Flask-HTTPAuth がいいかもしれまえん
Flask-BasicAuth はもうメンテナンスされていません

0 件のコメント:

コメントを投稿