コンテンツにスキップ

古い 403 認証エラーのステータスコードを使う

🌐 AI と人間による翻訳

この翻訳は、人間のガイドに基づいて AI によって作成されました。🤝

原文の意図を取り違えていたり、不自然な表現になっている可能性があります。🤖

AI LLM をより適切に誘導するのを手伝う ことで、この翻訳を改善できます。

英語版

FastAPI バージョン 0.122.0 より前は、統合されたセキュリティユーティリティが認証に失敗してクライアントへエラーを返す際、HTTP ステータスコード 403 Forbidden を使用していました。

FastAPI バージョン 0.122.0 以降では、より適切な HTTP ステータスコード 401 Unauthorized を使用し、HTTP 仕様に従ってレスポンスに妥当な WWW-Authenticate ヘッダーを含めます。RFC 7235RFC 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}

豆知識

この関数は例外インスタンスを返す点に注意してください。ここでは例外を送出しません。送出は内部の他のコードで行われます。