1. 用户身份验证和生成 Token:
使用 OAuth2PasswordBearer 进行用户身份验证,并使用 Pydantic 模型定义 Token 的格式。
from fastapi import FastAPI, Depends, HTTPException, status
from fastapi.security import OAuth2PasswordBearer
from jose import JWTError, jwt
app = FastAPI()
oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")
SECRET_KEY = "your-secret-key"
ALGORITHM = "HS256"
def verify_token(token: str = Depends(oauth2_scheme)):
credentials_exception = HTTPException(
status_code=status.HTTP_401_UNAUTHORIZED,
detail="Could not validate credentials",
headers={"WWW-Authenticate": "Bearer"},
)
try:
payload = jwt.decode(token, SECRET_KEY, algorithms=[ALGORITHM])
username: str = payload.get("sub")
if username is None:
raise credentials_exception
except JWTError:
raise credentials_exception
return username
@app.post("/token")
async def login(username: str, password: str):
# 验证用户身份的逻辑,通常会查询数据库
# 如果验证通过,生成 Token 并返回给客户端
user = {"username": username}
token = jwt.encode({"sub": username}, SECRET_KEY, algorithm=ALGORITHM)
return {"access_token": token, "token_type": "bearer"}
@app.get("/users/me")
async def read_users_me(current_user: str = Depends(verify_token)):
return {"username": current_user}
在这个例子中,我们使用了 OAuth2PasswordBearer 进行用户身份验证,并使用 Pydantic 模型定义了 Token 的格式。在路径操作函数 read_users_me 中,通过 Depends(verify_token) 实现了用户的身份验证。
2. 处理安全标头:
FastAPI 提供了一些用于处理安全标头的工具。例如,可以使用 Depends 来检查 HTTPException 是否包含 WWW-Authenticate 标头,如果是,表示需要进行身份验证。
from fastapi import FastAPI, Depends, HTTPException, Header
app = FastAPI()
async def check_security_header(authorization: str = Header(...)):
if "Bearer" not in authorization:
raise HTTPException(
status_code=401,
detail="Invalid authentication",
headers={"WWW-Authenticate": "Bearer"},
)
return authorization
@app.get("/secure-data")
async def get_secure_data(security_header: str = Depends(check_security_header)):
return {"message": "This is secure data"}
在这个例子中,我们使用了 check_security_header 依赖函数来检查安全标头。如果标头中不包含 "Bearer",则抛出 HTTP 异常,包含 WWW-Authenticate 标头。
这些是一些 FastAPI 中实现高级安全的示例。根据具体需求,还可以使用其他工具和功能来提高应用程序的安全性。
转载请注明出处:http://www.pingtaimeng.com/article/detail/7414/FastAPI