使用旧版 403 身份验证错误状态码¶
在 FastAPI 0.122.0 版本之前,当内置的安全实用程序在身份验证失败后向客户端返回错误时,使用的是 HTTP 状态码 403 Forbidden。
从 FastAPI 0.122.0 版本开始,它们改用更合适的 HTTP 状态码 401 Unauthorized,并在响应中返回合理的 WWW-Authenticate 头部,以符合 HTTP 规范 RFC 7235 和 RFC 9110。
但如果出于某种原因,您的客户端依赖于旧的行为,您可以通过重写安全类中的 make_not_authenticated_error 方法来恢复它。
例如,您可以创建一个 HTTPBearer 的子类,使其返回 403 Forbidden 错误而不是默认的 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}
提示
请注意,该函数返回的是异常实例,而不是抛出异常。抛出异常的操作由内部代码的其他部分完成。