El objetivo de esta Prueba de Concepto (PoC) es demostrar la capacidad de FastAPI para implementar un microservicio de autenticación de usuarios utilizando JSON Web Token (JWT) y OAuth2. Este microservicio garantizará la autenticación segura de usuarios y podrá ser integrado con otros servicios. Además, esta PoC emplea una arquitectura hexagonal, asegurando una separación clara de responsabilidades y facilitando la escalabilidad y mantenibilidad del código. Esta PoC servirá como una guía para escalar el servicio en múltiples tipos de proyectos, independientemente de su categoría, proporcionando una base sólida para futuras implementaciones.
- Python 3.12
- FastAPI 0.111.0
- SQLAlchemy 2.0.31
- Pydantic 2.8.2
- Passlib 1.7.4
- PyJWT 2.8.0
- uvicorn 0.30.1
- SQLite
- Poetry 1.8.3
- PyCharm 2024.1.4 (Community Edition)
Clone este repositorio a su máquina local utilizando Git.
Instale Poetry siguiendo las instrucciones en https://python-poetry.org/docs/#installation.
Desde una terminal PowerShell (PS), navegue hasta la ubicación del directorio .../auth-fatapi/
y use Poetry para instalar las dependencias:
poetry install
Desde la misma PS sete el ambiente deseado (development, production, test) asegurese de tener configurado los archivos de configuración .env
$env:ENVIRONMENT = 'development'
Ubicado en el directorio .../auth-fatapi/
$env:PYTHONPATH = Get-Location
Puede verificar las variabes de entorno con:
echo $env:PYTHONPATH
echo $env:ENVIRONMENT
Nota: Este paso se debe ejecutar cada vez que abre una nueva terminal y dependerá de la consola que se utilice (Bash, PowerShell, CMD (Command Prompt):)
Desde una terminal, navegue hasta la ubicación del directorio .../auth-fatapi/
y ejecute Uvicorn para iniciar la aplicación:
uvicorn src.infrastructure.web.fastapi.api:app --reload
Este comando carga la aplicación FastAPI y la reinicia automáticamente cada vez que detecta un cambio en el código fuente.
Para insertar usuarios de prueba utilizando el script seed_users.py
, ejecute el siguiente comando con Poetry:
poetry run python scripts/seed_users.py
Este comando utiliza Poetry para ejecutar el script seed_users.py, que inserta usuarios de prueba en la base de datos configurada.
Acceder a Swagger para Probar la Autenticación
Después de configurar las variables de entorno y iniciar la aplicación, acceda a Swagger (normalmente disponible en http://localhost:8000/docs) para probar la autenticación utilizando el usuario de prueba:
Usuario: johndoe
Contraseña: secret
Registro de Usuarios: Permite registrar nuevos usuarios con contraseña segura. Inicio de Sesión: Autentica a los usuarios y genera tokens JWT válidos. Validación de Tokens: Verifica la autenticidad y validez de los tokens JWT. Protección de Rutas: Ejemplo de cómo proteger rutas y endpoints usando JWT para autorización. Screenshots 📸 Incluya capturas de pantalla de ejemplos de uso de la API para guiar visualmente.
Para implementar esta PoC de Auth con JWT:
Configure la configuración del entorno de producción en config.py. Despliegue la aplicación usando Docker u otro método de implementación preferido.
¡Se aceptan contribuciones! Por favor, siga las pautas de contribución detalladas en CONTRIBUTING.md.
Este proyecto está bajo la Licencia MIT. Consulte el archivo LICENSE para obtener más detalles.
-
Autenticación (Obtención del Token de Acceso)
-
El usuario envía sus credenciales (nombre de usuario y contraseña) al endpoint /token.
-
La API verifica las credenciales y genera un token de acceso si son válidas.
-
Este token de acceso tiene una duración limitada (por ejemplo, 15 minutos).
POST /token Content-Type: application/x-www-form-urlencoded username=user&password=password
-
-
Creación del Refresh Token
- Después de obtener el token de acceso, el cliente puede solicitar un refresh token que le permitirá obtener un nuevo token de acceso sin necesidad de ingresar las credenciales nuevamente.
- El refresh token tiene una duración más larga que el token de acceso (por ejemplo, 30 días).
POST /token/refresh Authorization: Bearer <refresh_token>
-
Renovación del Token de Acceso (Refresh Token)
- Cuando el token de acceso expira, el cliente puede utilizar el refresh token para solicitar un nuevo token de acceso sin necesidad de autenticarse nuevamente.
- La API valida el refresh token y emite un nuevo token de acceso.
POST /token/refresh Content-Type: application/x-www-form-urlencoded refresh_token=<refresh_token>
-
Manejo de Expiración de Tokens
- Si tanto el token de acceso como el refresh token han expirado, el usuario debe autenticarse nuevamente (repetir el paso 1).
El cliente envía las credenciales al endpoint /token para obtener un token de acceso.
Después de obtener el token de acceso, el cliente puede solicitar un refresh token en el endpoint /token/refresh.
Cuando el token de acceso expira, el cliente usa el refresh token en /token/refresh para obtener un nuevo token de acceso.
Si ambos tokens expiran, el usuario debe autenticarse nuevamente en /token.
Este flujo asegura que los usuarios puedan mantenerse autenticados de manera segura y continua en tu API, minimizando la necesidad de ingresar credenciales repetidamente y manteniendo un alto nivel de seguridad. Asegúrate de adaptar este flujo según las necesidades específicas y requisitos de tu aplicación.