Zum Inhalt

Alte 403-Authentifizierungsfehler-Statuscodes verwenden

Vor FastAPI-Version 0.122.0 verwendeten die integrierten Sicherheits-Utilities den HTTP-Statuscode 403 Forbidden, wenn sie dem Client nach einer fehlgeschlagenen Authentifizierung einen Fehler zurückgaben.

Ab FastAPI-Version 0.122.0 verwenden sie den passenderen HTTP-Statuscode 401 Unauthorized und geben in der Response einen sinnvollen WWW-Authenticate-Header zurück, gemäß den HTTP-Spezifikationen, RFC 7235, RFC 9110.

Aber falls Ihre Clients aus irgendeinem Grund vom alten Verhalten abhängen, können Sie darauf zurückgreifen, indem Sie in Ihren Sicherheitsklassen die Methode make_not_authenticated_error überschreiben.

Sie können beispielsweise eine Unterklasse von HTTPBearer erstellen, die einen Fehler 403 Forbidden zurückgibt, statt des Default-401 Unauthorized-Fehlers:

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}
🤓 Other versions and variants
from fastapi import Depends, FastAPI, HTTPException, status
from fastapi.security import HTTPAuthorizationCredentials, HTTPBearer
from typing_extensions import Annotated

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}

Tipp

Beachten Sie, dass die Funktion die Exception-Instanz zurückgibt; sie wirft sie nicht. Das Werfen erfolgt im restlichen internen Code.