推荐答案
在 FastAPI 中使用 HTTP Bearer 认证可以通过 OAuth2PasswordBearer 来实现。以下是一个简单的示例:
// www.javascriptcn.com code example
from fastapi import Depends, FastAPI, HTTPException, status
from fastapi.security import OAuth2PasswordBearer
from pydantic import BaseModel
app = FastAPI()
oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")
class User(BaseModel):
username: str
def fake_decode_token(token):
return User(username=token)
async def get_current_user(token: str = Depends(oauth2_scheme)):
user = fake_decode_token(token)
if not user:
raise HTTPException(
status_code=status.HTTP_401_UNAUTHORIZED,
detail="Invalid authentication credentials",
headers={"WWW-Authenticate": "Bearer"},
)
return user
@app.get("/items/")
async def read_items(current_user: User = Depends(get_current_user)):
return {"username": current_user.username}在这个示例中,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 以获取用户信息。
// www.javascriptcn.com code example
async def get_current_user(token: str = Depends(oauth2_scheme)):
user = fake_decode_token(token)
if not user:
raise HTTPException(
status_code=status.HTTP_401_UNAUTHORIZED,
detail="Invalid authentication credentials",
headers={"WWW-Authenticate": "Bearer"},
)
return userDepends(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 认证。