OAuth2PasswordBearer — схема аутентификации через Bearer токен в FastAPI.
Схема OAuth2
from fastapi.security import OAuth2PasswordBearer, OAuth2PasswordRequestForm
from fastapi import Depends, HTTPException
# tokenUrl — URL для получения токена
oauth2_scheme = OAuth2PasswordBearer(tokenUrl="/auth/token")
Форма входа (OAuth2PasswordRequestForm)
from fastapi import APIRouter
from fastapi.security import OAuth2PasswordRequestForm
router = APIRouter(prefix="/auth")
@router.post("/token")
def login(form_data: OAuth2PasswordRequestForm = Depends()):
# form_data.username
# form_data.password
user = authenticate(form_data.username, form_data.password)
if not user:
raise HTTPException(status_code=401, detail="Неверные данные")
token = create_token(user.id)
return {
"access_token": token,
"token_type": "bearer", # обязательно!
}
Использование токена в запросе
# Получить токен
curl -X POST /auth/token \
-F "username=user" \
-F "password=pass"
# Использовать токен
curl /api/tasks/ \
-H "Authorization: Bearer eyJhbGci..."
Извлечение токена в endpoint
@app.get("/tasks/")
async def list_tasks(token: str = Depends(oauth2_scheme)):
# token — сырая строка токена
user = decode_token(token)
return get_tasks(user)
Опциональная аутентификация
from fastapi.security import OAuth2PasswordBearer
from fastapi import Depends
oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token", auto_error=False)
@app.get("/tasks/")
def list_tasks(token: str | None = Depends(oauth2_scheme)):
if token:
user = decode_token(token)
return get_user_tasks(user)
return get_public_tasks()
Refresh токены
class TokenResponse(BaseModel):
access_token: str
refresh_token: str
token_type: str = "bearer"
expires_in: int
@router.post("/token", response_model=TokenResponse)
def login(form_data: OAuth2PasswordRequestForm = Depends()):
user = authenticate(form_data.username, form_data.password)
return {
"access_token": create_access_token(user.id),
"refresh_token": create_refresh_token(user.id),
"expires_in": 1800,
}
💬 Комментарии (0)
Комментариев пока нет
Станьте первым, кто поделится мнением об этой статье!