概要
特にライブラリを使わずに実装する方法を紹介します
環境
- 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 件のコメント:
コメントを投稿