推荐答案
在 FastAPI 中使用 OAuth2 进行身份验证可以通过 OAuth2PasswordBearer 和 OAuth2PasswordRequestForm 来实现。以下是一个简单的示例:
// www.javascriptcn.com code example
from fastapi import Depends, FastAPI, HTTPException, status
from fastapi.security import OAuth2PasswordBearer, OAuth2PasswordRequestForm
from pydantic import BaseModel
app = FastAPI()
# 模拟用户数据库
fake_users_db = {
"johndoe": {
"username": "johndoe",
"full_name": "John Doe",
"email": "johndoe@example.com",
"hashed_password": "fakehashedsecret",
"disabled": False,
}
}
# OAuth2 密码模式
oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")
class User(BaseModel):
username: str
email: str | None = None
full_name: str | None = None
disabled: bool | None = None
class UserInDB(User):
hashed_password: str
def fake_hash_password(password: str):
return "fakehashed" + password
def get_user(db, username: str):
if username in db:
user_dict = db[username]
return UserInDB(**user_dict)
def fake_decode_token(token):
user = get_user(fake_users_db, token)
return user
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.post("/token")
async def login(form_data: OAuth2PasswordRequestForm = Depends()):
user_dict = fake_users_db.get(form_data.username)
if not user_dict:
raise HTTPException(status_code=400, detail="Incorrect username or password")
user = UserInDB(**user_dict)
hashed_password = fake_hash_password(form_data.password)
if not hashed_password == user.hashed_password:
raise HTTPException(status_code=400, detail="Incorrect username or password")
return {"access_token": user.username, "token_type": "bearer"}
@app.get("/users/me")
async def read_users_me(current_user: User = Depends(get_current_user)):
return current_user本题详细解读
OAuth2 简介
OAuth2 是一种授权框架,允许第三方应用在用户授权的情况下访问用户的资源。FastAPI 提供了内置的支持来处理 OAuth2 的身份验证流程。
OAuth2PasswordBearer
OAuth2PasswordBearer 是 FastAPI 提供的一个安全工具,用于处理 OAuth2 的密码模式。它会在请求头中查找 Authorization 字段,并提取出 Bearer Token。
OAuth2PasswordRequestForm
OAuth2PasswordRequestForm 是一个依赖项,用于处理 OAuth2 密码模式的表单提交。它会自动解析请求中的 username 和 password 字段。
实现步骤
- 定义用户模型:使用
pydantic定义用户模型,包括用户名、邮箱、全名等信息。 - 模拟用户数据库:在示例中,我们使用一个字典来模拟用户数据库。
- 定义 OAuth2 密码模式:使用
OAuth2PasswordBearer定义 OAuth2 的密码模式,并指定tokenUrl。 - 实现用户认证逻辑:在
get_current_user函数中,通过解析 Token 来获取当前用户。 - 实现登录接口:在
/token接口中,验证用户名和密码,并返回一个 Token。 - 实现受保护的路由:在
/users/me接口中,使用get_current_user依赖项来保护路由,只有认证用户才能访问。
注意事项
- 在实际应用中,密码应该使用安全的哈希算法进行存储,而不是直接存储明文密码。
- Token 的生成和验证应该使用安全的库,如
PyJWT。 - 需要处理 Token 的过期和刷新逻辑,以确保系统的安全性。