推荐答案
在 FastAPI 中使用 HTTP Bearer 认证可以通过 OAuth2PasswordBearer
来实现。以下是一个简单的示例:
-- -------------------- ---- ------- ---- ------- ------ -------- -------- -------------- ------ ---- ---------------- ------ -------------------- ---- -------- ------ --------- --- - --------- ------------- - -------------------------------------- ----- ---------------- --------- --- --- ------------------------- ------ -------------------- ----- --- ----------------------- --- - ------------------------ ---- - ------------------------ -- --- ----- ----- -------------- ----------------------------------------- --------------- -------------- ------------- ---------------------------- ---------- - ------ ---- ------------------- ----- --- ------------------------ ---- - --------------------------- ------ ------------ ----------------------
在这个示例中,OAuth2PasswordBearer
用于定义 Bearer 认证的流程。tokenUrl
参数指定了获取 token 的 URL。get_current_user
函数用于验证 token 并返回当前用户。
本题详细解读
1. OAuth2PasswordBearer
OAuth2PasswordBearer
是 FastAPI 提供的一个安全工具,用于处理 OAuth2 的 Bearer 认证。它会在请求头中查找 Authorization
字段,并提取 Bearer token。
oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")
tokenUrl
:指定获取 token 的 URL。这个 URL 通常是一个登录接口,用户通过该接口获取 token。
2. 获取当前用户
get_current_user
函数依赖于 oauth2_scheme
,它会从请求头中提取 token,并通过 fake_decode_token
函数解码 token 以获取用户信息。
-- -------------------- ---- ------- ----- --- ----------------------- --- - ------------------------ ---- - ------------------------ -- --- ----- ----- -------------- ----------------------------------------- --------------- -------------- ------------- ---------------------------- ---------- - ------ ----
Depends(oauth2_scheme)
:表示get_current_user
函数依赖于oauth2_scheme
来获取 token。fake_decode_token
:这是一个模拟函数,实际应用中应该替换为真实的 token 解码逻辑。
3. 使用认证
在路由中使用 Depends(get_current_user)
来确保只有认证通过的用户才能访问该路由。
@app.get("/items/") async def read_items(current_user: User = Depends(get_current_user)): return {"username": current_user.username}
current_user: User = Depends(get_current_user)
:表示该路由依赖于get_current_user
函数来获取当前用户信息。
4. 错误处理
如果 token 无效或未提供,get_current_user
函数会抛出 HTTPException
,返回 401 状态码和错误信息。
raise HTTPException( status_code=status.HTTP_401_UNAUTHORIZED, detail="Invalid authentication credentials", headers={"WWW-Authenticate": "Bearer"}, )
status_code=status.HTTP_401_UNAUTHORIZED
:表示未授权状态码。headers={"WWW-Authenticate": "Bearer"}
:在响应头中添加WWW-Authenticate
字段,提示客户端使用 Bearer 认证。