Curso Flutter y .NET 8 con Novita AI: índice completo paso a paso
Actualizado: 20 de febrero de 2026.
Aquí montas el backend principal y entiendes cómo validar el token Firebase en cada request.
Prerrequisitos
- Tener clonado o disponible
codigo/de esta serie. - Contar con Firebase y Novita configurados para pruebas.
- Haber completado el capítulo anterior del curso.
Paso 1: Estructura base
El proyecto principal está en:
codigo/backend/InvitaIA.Api/
Piezas clave:
Program.cs: DI, Auth, CORS, Swagger, Hangfire.Auth/FirebaseAuthenticationHandler.cs: valida ID token.Controllers/*: endpoints REST.Services/*: dominio e integración externa.
Paso 2: Revisar pipeline de autenticación
builder.Services
.AddAuthentication("Firebase")
.AddScheme<AuthenticationSchemeOptions, FirebaseAuthenticationHandler>("Firebase", _ => { });
builder.Services.AddAuthorization();
Con esto, los controladores con [Authorize] exigen token válido.
Paso 3: Extraer UID en controladores
En InvitationsController se usa:
private string Uid => User.FindFirstValue("user_id") ?? string.Empty;
Ese user_id lo establece el FirebaseAuthenticationHandler tras validar token.
Paso 4: Diagrama de auth
sequenceDiagram
participant App as Flutter App
participant FA as Firebase Auth
participant API as .NET API
App->>FA: Login Google
FA-->>App: idToken
App->>API: Authorization: Bearer idToken
API->>FA: VerifyIdTokenAsync
FA-->>API: uid + claims
API-->>App: 200/401
Paso 5: Verificar endpoints protegidos
cd codigo/backend
rg -n "\[Authorize\]" InvitaIA.Api/Controllers -S
Endpoints públicos relevantes:
POST /api/webhooks/novita(AllowAnonymous)GET /api/invitations/{id}/share(AllowAnonymous)
Troubleshooting
401 Unauthorized: token inválido o expirado.FirebaseAuth.DefaultInstancefalla: JSON Admin mal configurado.user_idvacío: el handler no se ejecutó o token no llegó.
FAQ corta
¿Por qué no validar JWT manualmente?
Porque Firebase Admin SDK ya implementa validación completa de firma y claims.
¿Puedo usar email/password en lugar de Google?
Sí, si Firebase emite ID token válido, el backend no cambia.
¿Qué claim define admin?
is_admin, obtenido desde Firestore en el handler.
Fuente verificada
- Código del curso:
codigo/backend/InvitaIA.Api/Program.cscodigo/backend/InvitaIA.Api/Auth/FirebaseAuthenticationHandler.cscodigo/backend/InvitaIA.Api/Controllers/InvitationsController.cs
- Documentación oficial:
Share this content: