Este ejemplo muestra cómo integrar autenticación con Google en FastAPI y cómo controlar el acceso a diferentes endpoints.
- ✅ Autenticación con Google OAuth2
- ✅ Verificación de tokens de Google
- ✅ Endpoints públicos (sin autenticación)
- ✅ Endpoints protegidos (requieren autenticación)
- ✅ Endpoints con autenticación opcional
- ✅ Control de acceso basado en roles (ejemplo de admin)
- Instalar las dependencias:
pip install -r requirements.txt- Configurar variables de entorno:
Crear un archivo .env o exportar las variables:
export GOOGLE_CLIENT_ID="tu-client-id.apps.googleusercontent.com"- Ve a Google Cloud Console
- Crea un nuevo proyecto o selecciona uno existente
- Habilita la API de Google+ o Google Identity
- Ve a "Credenciales" y crea un ID de cliente OAuth 2.0
- Configura los URI de redirección autorizados:
http://localhost:8000(desarrollo)- Tu dominio de producción
python main.pyO usando uvicorn directamente:
uvicorn main:app --reloadGET /
No requiere autenticación.
POST /auth/google
Body: { "token": "token-de-google-id" }
GET /protected
Headers: Authorization: Bearer <token>
Requiere autenticación.
GET /user/me
Headers: Authorization: Bearer <token>
Retorna información del usuario autenticado.
GET /optional
Headers: Authorization: Bearer <token> (opcional)
Funciona con o sin autenticación.
GET /admin
Headers: Authorization: Bearer <token>
Requiere autenticación Y rol de administrador.
- Frontend: El usuario inicia sesión con Google usando la biblioteca de Google Sign-In
- Frontend: Obtiene el token de ID de Google
- Frontend: Envía el token al endpoint
/auth/google - Backend: Verifica el token con Google
- Backend: (Opcional) Genera un JWT propio para futuras peticiones
- Frontend: Usa el token en las peticiones siguientes como
Authorization: Bearer <token>
// Cargar la biblioteca de Google Sign-In
<script src="https://accounts.google.com/gsi/client" async defer></script>
// Inicializar Google Sign-In
google.accounts.id.initialize({
client_id: 'TU_GOOGLE_CLIENT_ID',
callback: handleCredentialResponse
});
// Función callback
async function handleCredentialResponse(response) {
const token = response.credential;
// Enviar token al backend
const result = await fetch('http://localhost:8000/auth/google', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({ token: token })
});
const data = await result.json();
console.log('Usuario autenticado:', data.user);
// Guardar token para futuras peticiones
localStorage.setItem('access_token', data.access_token);
}
// Llamar a endpoint protegido
async function callProtectedEndpoint() {
const token = localStorage.getItem('access_token');
const response = await fetch('http://localhost:8000/protected', {
headers: {
'Authorization': `Bearer ${token}`
}
});
const data = await response.json();
console.log(data);
}- Generar JWT propio: No usar el token de Google directamente, generar tu propio JWT después de validar
- Base de datos: Guardar usuarios y permisos en una base de datos
- Refresh tokens: Implementar renovación de tokens
- Rate limiting: Limitar intentos de autenticación
- Logging: Registrar intentos de acceso y errores
- CORS: Configurar CORS apropiadamente
- HTTPS: Usar siempre HTTPS en producción
- Validación adicional: Verificar dominio del email, estado del usuario, etc.
fastapi_google_auth_example/
├── main.py # Aplicación FastAPI principal
├── requirements.txt # Dependencias Python
├── .gitignore # Archivos ignorados por Git
└── README.md # Este archivo
- ✅ Los tokens se verifican con Google antes de usar
- ✅ Se valida que el token pertenece al cliente correcto
- ✅ Los endpoints protegidos requieren autenticación válida
⚠️ En producción, implementa JWT propio y no uses el token de Google directamente⚠️ Configura CORS apropiadamente⚠️ Usa HTTPS en producción
Este ejemplo es de código abierto y está disponible para uso educativo y de desarrollo.
Las contribuciones son bienvenidas. Por favor, abre un issue o pull request si tienes sugerencias o mejoras.