Saltar a contenido

Table of Contents generated with DocToc

Investigacion: Firebase Authentication - Guia Completa

Identificador: MTS-INV-015 Version: 1.0.0 Fecha: 2025-12-07 Autor: SpecQueen + SecurityDrone Solicitado en: IT-02 (Seguridad Servidor) Estado: Completado


1. Resumen Ejecutivo

Investigacion tecnica de Firebase Authentication para su implementacion como proveedor de identidad en MedTime. Cubre metodos de autenticacion, MFA, precios, y consideraciones de seguridad para aplicaciones HIPAA-compliant.

1.1. Conclusion Principal

Aspecto Evaluacion Notas
Seguridad Excelente OAuth 2.0 + OpenID Connect
MFA Disponible SMS + TOTP (requiere Identity Platform)
Integracion Sencilla SDKs nativos iOS/Android/Web
HIPAA Compatible Con BAA y configuracion adecuada
Costo Escalable Free tier generoso

2. Descripcion de Firebase Authentication

2.1. Que es Firebase Authentication

Firebase Authentication proporciona servicios backend, SDKs faciles de usar, y bibliotecas UI listas para autenticar usuarios. Soporta autenticacion mediante passwords, numeros de telefono, proveedores federados (Google, Facebook, Apple, Twitter), y mas.

Aspecto Valor
Proveedor Google Cloud / Firebase
Estandares OAuth 2.0, OpenID Connect
Plataformas iOS, Android, Web, Flutter, C++, Unity
Free Tier 50,000 MAUs (Blaze) / 3,000 DAUs (Spark)

2.2. Metodos de Autenticacion Soportados

Metodo Disponibilidad Uso en MedTime
Email/Password Todos los planes Principal
Google Sign-In Todos los planes Social login
Apple Sign-In Todos los planes Requerido iOS
Facebook Todos los planes Opcional
Phone/SMS Todos los planes MFA
Anonymous Todos los planes Onboarding
SAML Identity Platform Enterprise
OpenID Connect Identity Platform Enterprise

3. Firebase Authentication vs Identity Platform

3.1. Comparacion de Funcionalidades

Funcionalidad Firebase Auth Identity Platform
Email/Password Si Si
Social Login Si Si
Phone Auth Si Si
Anonymous Auth Si Si
MFA (SMS) No Si
MFA (TOTP) No Si
Blocking Functions No Si
Audit Logging No Si
SAML/OIDC No Si
Multi-tenancy No Si
SLA Enterprise No Si

3.2. Recomendacion para MedTime

Recomendacion:
  tier_free:
    usar: Firebase Authentication basico
    mfa: Opcional (incentivar)

  tier_pro:
    usar: Identity Platform
    mfa: Requerido (TOTP preferido)
    blocking_functions: Para validaciones custom

  tier_perfect:
    usar: Identity Platform
    mfa: Requerido (TOTP)
    audit_logging: Habilitado
    multi_device: Con device binding

4. Multi-Factor Authentication (MFA)

4.1. Metodos MFA Disponibles

Metodo Seguridad UX Costo Recomendacion
TOTP Alta Media Bajo Preferido
SMS Media Alta Variable Backup

4.2. Configuracion TOTP MFA

// Habilitar TOTP via Admin SDK (Node.js)
const { getAuth } = require('firebase-admin/auth');

// Configurar proyecto para MFA
await getAuth().projectConfigManager().updateProjectConfig({
  multiFactorConfig: {
    providerConfigs: [
      {
        state: 'ENABLED',
        totpProviderConfig: {
          adjacentIntervals: 5  // Tolerancia de tiempo
        }
      }
    ]
  }
});

4.3. Requisitos de MFA

Requisitos MFA:
  email_verification:
    requerido: true
    razon: "Prevenir registro con email ajeno"

  sdk_versions:
    web: "v9.19.1+"
    android: "v22.1.0+"
    ios: "v10.12.0+"

  totp_apps_compatibles:
    - Google Authenticator
    - Microsoft Authenticator
    - Authy
    - 1Password

4.4. Flujo de Enrollment MFA

FLUJO ENROLLMENT MFA:
+------------------------------------------------------------------+

  USUARIO                    APP                      FIREBASE
     |                        |                           |
     |  1. Iniciar MFA        |                           |
     |----------------------->|                           |
     |                        |  2. Generar secreto TOTP  |
     |                        |-------------------------->|
     |                        |  3. Secret + QR Code      |
     |                        |<--------------------------|
     |  4. Mostrar QR         |                           |
     |<-----------------------|                           |
     |                        |                           |
     |  5. Escanear + codigo  |                           |
     |----------------------->|                           |
     |                        |  6. Verificar codigo      |
     |                        |-------------------------->|
     |                        |  7. MFA habilitado        |
     |                        |<--------------------------|
     |  8. Confirmacion       |                           |
     |<-----------------------|                           |

+------------------------------------------------------------------+

5. ID Tokens y JWT

5.1. Estructura del ID Token

Firebase ID tokens son JWTs que cumplen con OpenID Connect. Estructura:

{
  "header": {
    "alg": "RS256",
    "typ": "JWT",
    "kid": "firebase-key-id"
  },
  "payload": {
    "iss": "https://securetoken.google.com/{project-id}",
    "aud": "{project-id}",
    "auth_time": 1701936000,
    "user_id": "uid123...",
    "sub": "uid123...",
    "iat": 1701936000,
    "exp": 1701939600,
    "email": "user@example.com",
    "email_verified": true,
    "firebase": {
      "identities": {
        "email": ["user@example.com"]
      },
      "sign_in_provider": "password"
    }
  }
}

5.2. Claims Reservados

Los siguientes claims son reservados por OpenID Connect y Firebase:

Claims Reservados (NO usar como custom claims):
  oidc:
    - acr
    - amr
    - at_hash
    - aud
    - auth_time
    - azp
    - cnf
    - c_hash
    - exp
    - iat
    - iss
    - jti
    - nbf
    - nonce
    - sub

  firebase:
    - firebase
    - user_id

5.3. Duracion y Refresh

Token Lifecycle:
  id_token:
    duracion: 1 hora
    refresh: Automatico via SDK

  refresh_token:
    duracion: Indefinido (hasta revocacion)
    revocacion:
      - Cambio de password
      - Deshabilitacion de cuenta
      - Revocacion manual via Admin SDK

6. Custom Claims

6.1. Que son Custom Claims

Custom claims permiten agregar atributos personalizados al ID token del usuario para implementar control de acceso basado en roles (RBAC).

6.2. Limitaciones

Limitaciones Custom Claims:
  tamano_maximo: 1000 bytes (payload completo)

  tipos_soportados:
    - string
    - number
    - boolean
    - array
    - object
    - null

  tipos_NO_soportados:
    - Date
    - undefined
    - functions
    - otros no-JSON

  propagacion:
    - Al siguiente login
    - Al expirar token actual (1 hora)
    - Con getIdToken(true) forzado

6.3. Custom Claims para MedTime

# Ejemplo: Asignar claims de MedTime
import firebase_admin
from firebase_admin import auth

def set_medtime_claims(uid: str, tier: str, role: str, device_id: str):
    """Asigna custom claims de MedTime a un usuario."""

    claims = {
        "medtime_tier": tier,        # "free", "pro", "perfect"
        "medtime_role": role,        # "patient", "caregiver", "admin"
        "medtime_device_id": device_id,
        "medtime_permissions": get_permissions_for_tier(tier)
    }

    # Verificar tamano < 1000 bytes
    import json
    claims_size = len(json.dumps(claims).encode('utf-8'))
    if claims_size > 1000:
        raise ValueError(f"Claims exceden 1000 bytes: {claims_size}")

    auth.set_custom_user_claims(uid, claims)

6.4. Acceso a Claims

// Cliente: Obtener claims del token
const user = firebase.auth().currentUser;
const tokenResult = await user.getIdTokenResult();

if (tokenResult.claims.medtime_tier === 'pro') {
  // Mostrar funcionalidades Pro
}

// Servidor: Verificar claims
const decodedToken = await admin.auth().verifyIdToken(idToken);
if (decodedToken.medtime_tier === 'pro') {
  // Permitir acceso a recursos Pro
}

7. Seguridad y Mejores Practicas

7.1. Verificacion de Tokens

# Python: Verificacion segura de ID token
from firebase_admin import auth

async def verify_token_secure(id_token: str) -> dict:
    """Verifica un ID token de forma segura."""

    try:
        # Verificar firma, expiracion, y audiencia
        decoded = auth.verify_id_token(id_token)

        # Validaciones adicionales
        if not decoded.get('email_verified', False):
            raise ValueError("Email no verificado")

        # Para operaciones sensibles, verificar revocacion
        # (costo adicional de latencia)
        auth.verify_id_token(id_token, check_revoked=True)

        return decoded

    except auth.ExpiredIdTokenError:
        raise AuthError("Token expirado", 401)
    except auth.RevokedIdTokenError:
        raise AuthError("Token revocado", 401)
    except auth.InvalidIdTokenError:
        raise AuthError("Token invalido", 401)

7.2. Seguridad del Password

Password Security:
  requisitos_minimos:
    longitud: 8 caracteres
    # Firebase maneja internamente

  recomendaciones_adicionales:
    - Validar en cliente antes de enviar
    - No almacenar passwords (Firebase lo maneja)
    - Implementar rate limiting en login

  password_reset:
    metodo: Email con link temporal
    expiracion: 1 hora
    unico_uso: true

7.3. Proteccion contra Ataques

Protecciones Integradas:
  brute_force:
    - Rate limiting automatico
    - CAPTCHA despues de intentos fallidos

  session_fixation:
    - Tokens regenerados en cada refresh

  csrf:
    - Tokens con binding a dominio

  xss:
    - SDK maneja tokens de forma segura
    - No exponer tokens en URL

8. Integracion con MedTime

8.1. Arquitectura Propuesta

ARQUITECTURA FIREBASE AUTH EN MEDTIME:
+------------------------------------------------------------------+

  +----------------+          +----------------+
  |   iOS App      |          |  Android App   |
  |  Firebase SDK  |          |  Firebase SDK  |
  +-------+--------+          +--------+-------+
          |                            |
          |     ID Token (JWT)         |
          +-------------+--------------+
                        |
                        v
          +-------------+-------------+
          |      API Gateway          |
          |   (Verifica JWT)          |
          +-------------+-------------+
                        |
                        v
          +-------------+-------------+
          |    Backend MedTime        |
          |  - Extrae claims          |
          |  - Configura RLS context  |
          |  - Procesa request        |
          +-------------+-------------+
                        |
                        v
          +-------------+-------------+
          |      PostgreSQL           |
          |  (RLS por user_id)        |
          +---------------------------+

+------------------------------------------------------------------+

8.2. Flujo de Autenticacion Completo

Flujo Login MedTime:

  1_inicio:
    cliente: "Usuario ingresa credenciales"
    destino: Firebase Auth

  2_verificacion:
    firebase: "Verifica credenciales"
    mfa: "Si habilitado, solicitar segundo factor"

  3_token:
    firebase: "Genera ID Token con claims"
    cliente: "Recibe y almacena token"

  4_request:
    cliente: "Envia request con Authorization header"
    formato: "Bearer {id_token}"

  5_backend:
    servidor: "Verifica token con Admin SDK"
    extrae: "uid, tier, permissions"

  6_rls:
    servidor: "SET LOCAL app.current_user_id = uid"
    postgresql: "Aplica RLS policies"

  7_response:
    servidor: "Retorna datos filtrados por RLS"

9. Precios y Costos

9.1. Estructura de Precios

Plan Limite Costo
Spark (Free) 3,000 DAUs $0
Blaze 50,000 MAUs $0
Blaze 50,001 - 100,000 MAUs $0.0055/MAU
Blaze 100,001 - 1M MAUs $0.0046/MAU
Blaze 1M+ MAUs $0.0032/MAU

9.2. Costos Adicionales

Costos Adicionales:
  sms_verification:
    usa: $0.01/SMS
    mexico: $0.06/SMS
    otros: Variable

  saml_oidc:
    por_mau: $0.015

  phone_auth:
    incluido: 10,000/mes
    adicional: Segun region

9.3. Estimacion para MedTime

Estimacion Costos (Primer ano):
  usuarios_free: 10,000
  usuarios_pro: 1,000
  usuarios_perfect: 100

  mau_total: 11,100

  costo_auth:
    base: $0 (bajo 50,000 MAUs)

  costo_sms:
    mfa_enrollments: ~500/mes
    costo_mensual: ~$30 (Mexico)

  total_anual_estimado: ~$400

10. Compliance y Regulaciones

10.1. HIPAA Compliance

HIPAA con Firebase:
  baa_disponible: true
  requisitos:
    - Firmar BAA con Google Cloud
    - Usar Identity Platform
    - Habilitar audit logging
    - Configurar MFA para datos sensibles

  phi_en_firebase:
    email: "Puede considerarse PHI"
    phone: "Puede considerarse PHI"
    custom_claims: "NO almacenar PHI"

  recomendacion:
    - Usar UIDs para referencias
    - PHI solo en cliente (cifrado)
    - Server es Zero-Knowledge

10.2. Audit Logging

Audit Logging (Identity Platform):
  eventos_registrados:
    - Creacion de cuenta
    - Login exitoso/fallido
    - Cambio de password
    - Habilitacion MFA
    - Revocacion de sesion

  retencion:
    defecto: 30 dias
    exportable: BigQuery

  formato:
    tipo: Cloud Logging
    estructura: JSON estructurado

11. Referencias

11.1. Documentacion Oficial

Recurso URL
Firebase Auth Docs https://firebase.google.com/docs/auth
Admin Auth API https://firebase.google.com/docs/auth/admin
Verify ID Tokens https://firebase.google.com/docs/auth/admin/verify-id-tokens
Custom Claims https://firebase.google.com/docs/auth/admin/custom-claims
MFA Web https://firebase.google.com/docs/auth/web/multi-factor
TOTP MFA https://firebase.google.com/docs/auth/web/totp-mfa
Identity Platform https://cloud.google.com/identity-platform

11.2. Documentos Internos Relacionados

ID Documento Relacion
TECH-SEC-SRV-001 05-seguridad-servidor.md Implementacion en servidor
TECH-SEC-CLIENT-001 04-seguridad-cliente.md Integracion en cliente
MTS-AUTH-001 Autenticacion Requisitos funcionales
INV-005 HIPAA Security Rule Compliance

Documento generado por SpecQueen + SecurityDrone Fuentes: Firebase Documentation, Google Cloud Identity Platform