Ir para o conteúdo

Usar antigos códigos de status de erro de autenticação 403

Antes da versão 0.122.0 do FastAPI, quando os utilitários de segurança integrados retornavam um erro ao cliente após uma falha na autenticação, eles usavam o código de status HTTP 403 Forbidden.

A partir da versão 0.122.0 do FastAPI, eles usam o código de status HTTP 401 Unauthorized, mais apropriado, e retornam um cabeçalho WWW-Authenticate adequado na response, seguindo as especificações HTTP, RFC 7235, RFC 9110.

Mas, se por algum motivo seus clientes dependem do comportamento antigo, você pode voltar a ele sobrescrevendo o método make_not_authenticated_error nas suas classes de segurança.

Por exemplo, você pode criar uma subclasse de HTTPBearer que retorne um erro 403 Forbidden em vez do erro padrão 401 Unauthorized:

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}

Dica

Perceba que a função retorna a instância da exceção, ela não a lança. O lançamento é feito no restante do código interno.