古い 403 認証エラーのステータスコードを使う¶
🌐 AI と人間による翻訳
この翻訳は、人間のガイドに基づいて AI によって作成されました。🤝
原文の意図を取り違えていたり、不自然な表現になっている可能性があります。🤖
AI LLM をより適切に誘導するのを手伝う ことで、この翻訳を改善できます。
FastAPI バージョン 0.122.0 より前は、統合されたセキュリティユーティリティが認証に失敗してクライアントへエラーを返す際、HTTP ステータスコード 403 Forbidden を使用していました。
FastAPI バージョン 0.122.0 以降では、より適切な HTTP ステータスコード 401 Unauthorized を使用し、HTTP 仕様に従ってレスポンスに妥当な WWW-Authenticate ヘッダーを含めます。RFC 7235、RFC 9110。
しかし、何らかの理由でクライアントが従来の挙動に依存している場合は、セキュリティクラスでメソッド make_not_authenticated_error をオーバーライドすることで、その挙動に戻せます。
たとえば、既定の 401 Unauthorized エラーの代わりに 403 Forbidden エラーを返す HTTPBearer のサブクラスを作成できます:
from typing import Annotated
from fastapi import Depends, FastAPI, HTTPException, status
from fastapi.security import HTTPAuthorizationCredentials, HTTPBearer
app = FastAPI()
class HTTPBearer403(HTTPBearer):
def make_not_authenticated_error(self) -> HTTPException:
return HTTPException(
status_code=status.HTTP_403_FORBIDDEN, detail="Not authenticated"
)
CredentialsDep = Annotated[HTTPAuthorizationCredentials, Depends(HTTPBearer403())]
@app.get("/me")
def read_me(credentials: CredentialsDep):
return {"message": "You are authenticated", "token": credentials.credentials}
豆知識
この関数は例外インスタンスを返す点に注意してください。ここでは例外を送出しません。送出は内部の他のコードで行われます。