Estoy usando el esquema de autenticación detallado en la guía del usuario de FastAPI (token JWT/Bearer). Cuando intento obtener un token del punto final /token la solicitud falla antes de que se ejecute la función de operación de ruta. Aquí está la función en cuestión:
async def login_for_access_token(form_data: OAuth2PasswordRequestForm = Depends(), session: SessionLocal = Depends(get_db)): user = authenticate_user(session, form_data.username, form_data.password) if not user: raise HTTPException( status_code=status.HTTP_401_UNAUTHORIZED, detail="Incorrect username or password", headers={"WWW-Authenticate": "Bearer"}, ) access_token = create_access_token(data={"sub": user.id}) return {"access_token": access_token, "token_type": "bearer"} Normalmente uso puntos de interrupción para ayudar a descubrir qué es lo que va mal en estas situaciones, pero la llamada falla antes de que se ejecute cualquier código en la función, lo que me lleva a creer que el problema está en la dependencia OAuth2PasswordRequestForm . Verifiqué que este era el problema al deshabilitar el form_data parameter y pude ejecutar la solicitud completa.
Los errores que recibo son bastante escasos en los detalles. Esto es lo que obtengo en la consola: INFO: 127.0.0.1:52261 - "POST /token HTTP/1.1" 400 Bad Request
Y esto es lo que veo en la interfaz de usuario de Swagger:
Esto funcionó para mí en el formato de un solo archivo utilizado en el tutorial, pero desde entonces he dividido las cosas en diferentes archivos para mantener organizado mi proyecto más grande. Tengo la sensación de que me perdí algo en algún lugar mientras reorganizaba este código, pero parece que no puedo entender qué está causando esto.
Por supuesto, la solución a este problema estaba en los documentos . El problema era que me faltaba la dependencia python-multipart . Simplemente ejecuté pip install python-multipart y reinicié mi servidor y luego pude autenticar.
Debe configurar response_model en token después de haber creado un esquema de token como este:
class Token(BaseModel): access_token: str token_type: strpor lo que su código debería verse así
@router.post('/token', response_body=Token)