ユーザー認証はWebアプリの基本機能です。パスワードのハッシュ化・JWTトークンによる認証の仕組みをFastAPIで実装します。
認証の方式比較
| 方式 | 仕組み | 向いている用途 |
|---|---|---|
| セッション認証 | サーバーにセッション情報を保存し、Cookieでセッション IDを管理 | Webサイト・従来型アプリ |
| JWT(JSON Web Token) | 署名付きトークンをクライアントが保持し、リクエスト時に送信 | REST API・SPAとの連携 |
| OAuth 2.0 | Googleや 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)) # TrueJWTトークンの発行
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は環境変数で管理しコードに直書きしない



コメント