在 FastAPI 中,你可以使用 OAuth2PasswordBearer 类来实现一个简单的 OAuth2 认证,结合密码(用户名和密码)和 Bearer Token。以下是一个使用密码和 Bearer 的简单 OAuth2 的示例:
from fastapi import FastAPI, Depends, HTTPException, status
from fastapi.security import OAuth2PasswordBearer, OAuth2PasswordRequestForm

app = FastAPI()

# OAuth2PasswordBearer 类用于处理密码和 Bearer Token
oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")

# 模拟的用户数据
fake_users_db = {
    "fakeuser": {
        "username": "fakeuser",
        "hashed_password": "fakehashedpassword",
        "email": "fakeuser@example.com",
    }
}

# 模拟函数,用于验证用户名和密码
def verify_user(username: str, password: str):
    user = fake_users_db.get(username)
    if user and user["hashed_password"] == password:
        return user

# 模拟函数,用于获取当前用户信息
def get_current_user(token: str = Depends(oauth2_scheme)):
    credentials_exception = HTTPException(
        status_code=status.HTTP_401_UNAUTHORIZED,
        detail="Invalid credentials",
        headers={"WWW-Authenticate": "Bearer"},
    )
    user_info = verify_user(token, token)
    if user_info is None:
        raise credentials_exception
    return user_info

# 登录路径操作,使用 OAuth2PasswordRequestForm 从表单获取用户名和密码
@app.post("/token")
async def login(form_data: OAuth2PasswordRequestForm = Depends()):
    user_info = verify_user(form_data.username, form_data.password)
    if user_info is None:
        raise HTTPException(
            status_code=status.HTTP_401_UNAUTHORIZED,
            detail="Invalid credentials",
            headers={"WWW-Authenticate": "Bearer"},
        )

    return {"access_token": user_info["username"], "token_type": "bearer"}

# 受保护的路径操作,使用 get_current_user 依赖项获取当前用户信息
@app.get("/users/me", response_model=dict)
async def read_users_me(current_user: dict = Depends(get_current_user)):
    return current_user

在这个示例中:

  •  /token 路径操作用于登录,接受用户名和密码,并返回一个包含访问令牌(Bearer Token)的响应。

  •  /users/me 路径操作用于获取当前用户信息,使用 get_current_user 依赖项来验证令牌,并从令牌中提取用户信息。


这是一个简单的例子,实际应用中你可能需要更强大的身份验证和令牌管理机制,例如使用数据库存储用户信息、JWT(JSON Web Tokens)等。确保在实际应用中使用适当的安全措施。


转载请注明出处:http://www.pingtaimeng.com/article/detail/7392/FastAPI