⑧Web開発

ユーザー認証の実装【JWT・パスワードハッシュ・FastAPI】

⑧Web開発
記事内に広告が含まれています。

ユーザー認証はWebアプリの基本機能です。パスワードのハッシュ化・JWTトークンによる認証の仕組みをFastAPIで実装します。

認証の方式比較

方式仕組み向いている用途
セッション認証サーバーにセッション情報を保存し、Cookieでセッション IDを管理Webサイト・従来型アプリ
JWT(JSON Web Token)署名付きトークンをクライアントが保持し、リクエスト時に送信REST API・SPAとの連携
OAuth 2.0Googleや GitHubなど外部サービスで認証を委任SNSログイン

パスワードのハッシュ化

pip install passlib[bcrypt] python-jose[cryptography]
from passlib.context import CryptContext

pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")

def hash_password(password: str) -> str:
    return pwd_context.hash(password)

def verify_password(plain: str, hashed: str) -> bool:
    return pwd_context.verify(plain, hashed)

# 平文パスワードは絶対にDBに保存しない
hashed = hash_password("mysecretpassword")
print(verify_password("mysecretpassword", hashed))  # True

JWTトークンの発行

from jose import jwt
from datetime import datetime, timedelta

SECRET_KEY = "your-secret-key-keep-it-secret"
ALGORITHM = "HS256"

def create_access_token(data: dict, expires_delta: timedelta = timedelta(hours=1)):
    to_encode = data.copy()
    to_encode["exp"] = datetime.utcnow() + expires_delta
    return jwt.encode(to_encode, SECRET_KEY, algorithm=ALGORITHM)

def decode_token(token: str):
    return jwt.decode(token, SECRET_KEY, algorithms=[ALGORITHM])

まとめ

  • パスワードは必ずbcryptなどでハッシュ化してDBに保存する(平文保存は厳禁)
  • JWTはサーバーにセッション情報を持たないステートレスな認証方式
  • SECRET_KEYは環境変数で管理しコードに直書きしない

コメント

タイトルとURLをコピーしました