Saltar al contenido

Lección 4 de 20 · Lectura y práctica

Práctica: Crear un servicio de autenticación con mensajes tipados

Concepto claveEn el desarrollo de microservicios, la comunicación entre servicios es fundamental. gRPC (Google Remote Procedure Call) y Protocol Buffers (protobuf) proporcionan un marco para crear servicios distribuidos.

Del concepto a la práctica

Taller de esta lección

Un servicio de autenticación tipado debe separar la entrada de credenciales del resultado de autenticación. El mensaje de respuesta no debe mezclar contraseña, token y datos de perfil; cada dato tiene un propósito y una exposición distinta.

Ejemplo resuelto

proto
message VerificarRequest { string usuario = 1; string secreto = 2; }
message VerificarResponse { bool autenticado = 1; string sujeto = 2; }

Para ana con secreto válido, la respuesta es autenticado=true, sujeto=ana; el secreto no vuelve al cliente.

Prueba (ana,LAB-ana-7), (ana,incorrecto) y (zoe,LAB-ana-7). Para los dos fallos usa el mismo UNAUTHENTICATED con mensaje genérico; no emitas sujeto ni token en el error. Autenticar identifica al sujeto; otro control decide sus permisos. Evita filtrar identidad mediante mensajes, tiempos evidentes o registros de secretos.

Pruébalo

  1. Define un registro local autorizado con ana y el secreto ficticio LAB-ana-7, sin reutilizar ninguna contraseña real.

  2. Solo para esta simulación local, compara con el secreto ficticio LAB-ana-7; devuelve únicamente el sujeto al coincidir. En un servicio real verifica hashes de contraseña con una biblioteca adecuada y transporte TLS; no almacenes secretos en claro.

  3. Ejecuta un caso válido y otro con secreto incorrecto.

Error frecuente: incluir el secreto recibido en logs o respuestas. Corrección: registra solo el sujeto anonimizado, resultado y correlación.

Comprueba tu resultado

Ejercicio: prueba ana válido, ana inválido y zoe inexistente. Resultado esperado: solo el primer caso autentica; los dos últimos comparten una respuesta segura sin revelar cuál dato falló.

Diagrama de decisión con ramas Sí y No y un bucle que procesa cada elemento de una lista.
CursaloMapa de práctica
Cómo avanza un programa

Una condición decide qué camino ejecuta el programa. Un bucle repite una operación mientras queden elementos, y termina cuando la lista se agota. Separar ambas ideas ayuda a seguir el flujo y comprobar casos límite.

Ver la infografía en tamaño completo ↗

Concepto clave

En el desarrollo de microservicios, la comunicación entre servicios es fundamental. gRPC (Google Remote Procedure Call) y Protocol Buffers (protobuf) proporcionan un marco para crear servicios distribuidos eficientes y tipados. Imagina que estás construyendo un sistema de autenticación donde múltiples servicios (como un servicio de usuarios, uno de pagos y otro de notificaciones) necesitan verificar credenciales de manera rápida y segura. Sin un protocolo tipado, podrías enviar datos mal formados o incompatibles entre servicios, similar a intentar encajar una llave en una cerradura equivocada—simplemente no funciona y causa errores.

Protocol Buffers actúa como el lenguaje de definición de interfaz (IDL) que especifica cómo se estructuran los datos, como un contrato legal que todos los servicios deben seguir. gRPC, por otro lado, es el mecanismo que usa ese contrato para realizar llamadas remotas de manera eficiente, aprovechando HTTP/2 para comunicación bidireccional y serialización binaria. En un escenario de autenticación, esto significa que puedes definir mensajes tipados para credenciales (como nombre de usuario y contraseña) y respuestas (como tokens de acceso), asegurando que cada servicio interprete los datos correctamente sin ambigüedades.

Cómo funciona en la práctica

Para implementar un servicio de autenticación con gRPC y Protocol Buffers, sigue estos pasos clave. Primero, define los mensajes tipados en un archivo .proto. Por ejemplo, crea un archivo llamado auth.proto que especifique las estructuras de datos para las solicitudes y respuestas de autenticación.

syntax = "proto3";

package auth;

service AuthService {
  rpc Login(LoginRequest) returns (LoginResponse);
  rpc ValidateToken(ValidateTokenRequest) returns (ValidateTokenResponse);
}

message LoginRequest {
  string username = 1;
  string password = 2;
}

message LoginResponse {
  string access_token = 1;
  int64 expires_in = 2; // segundos
}

message ValidateTokenRequest {
  string token = 1;
}

message ValidateTokenResponse {
  bool valid = 1;
  string user_id = 2;
}

Luego, usa el compilador de protobuf para generar código en tu lenguaje de programación (por ejemplo, Go, Python o Java). Este código incluirá clases o estructuras para los mensajes y stubs para el cliente y servidor gRPC. En el servidor, implementa la lógica de negocio para manejar las solicitudes, como verificar credenciales contra una base de datos y generar tokens JWT. En el cliente, usa el stub generado para hacer llamadas al servidor, asegurando que los datos se serialicen y deserialicen automáticamente según el contrato definido.

Caso de estudio

Considera una plataforma de comercio electrónico con microservicios para autenticación, pedidos y inventario. El servicio de autenticación, implementado con gRPC y Protocol Buffers, maneja el inicio de sesión de usuarios. Cuando un usuario intenta acceder, el cliente (como una aplicación web) envía una solicitud LoginRequest al servidor de autenticación. El servidor valida las credenciales, genera un token JWT y devuelve una LoginResponse. Luego, otros servicios, como el de pedidos, pueden usar el token para autorizar solicitudes mediante llamadas ValidateToken.

En pruebas de carga, este enfoque mostró una latencia reducida en un 40% comparado con APIs REST JSON, gracias a la serialización binaria de protobuf y la multiplexación de HTTP/2.

Para ilustrar, aquí hay una tabla que compara el flujo de datos:

PasoAcciónMensaje ProtobufResultado
1Cliente envía credencialesLoginRequestSolicitud serializada
2Servidor verifica en DBN/AValidación interna
3Servidor respondeLoginResponseToken generado
4Cliente usa tokenValidateTokenRequestAutorización en otros servicios

Errores comunes

Al implementar servicios de autenticación con gRPC y Protocol Buffers, los desarrolladores avanzados suelen cometer estos errores:

  1. No versionar los mensajes protobuf: Cambiar campos en mensajes existentes sin considerar compatibilidad hacia atrás puede romper clientes antiguos. Usa campos opcionales o añade nuevos campos en lugar de modificar los existentes.
  2. Ignorar el manejo de errores gRPC: gRPC usa códigos de estado específicos (como UNAUTHENTICATED o INVALID_ARGUMENT). No personalizar estos códigos puede llevar a respuestas genéricas que dificultan la depuración.
  3. Serializar datos sensibles sin cifrado: Aunque protobuf es eficiente, no cifra datos por defecto. En autenticación, asegúrate de usar TLS/SSL para proteger credenciales y tokens en tránsito.
  4. No probar con diferentes cargas: Los mensajes protobuf pueden tener un tamaño variable; no probar con datos grandes o malformados puede causar problemas de rendimiento o corrupción.

Checklist de dominio

Para verificar tu comprensión de esta lección, asegúrate de poder:

  • Definir mensajes protobuf para un servicio de autenticación con al menos dos operaciones (por ejemplo, login y validación de token).
  • Generar código cliente y servidor a partir de un archivo .proto usando el compilador protoc.
  • Implementar un servidor gRPC que maneje solicitudes de autenticación con lógica de negocio real (por ejemplo, verificación contra una base de datos simulada).
  • Configurar un cliente gRPC que envíe solicitudes y procese respuestas, incluyendo manejo de errores con códigos de estado apropiados.
  • Medir el rendimiento de la comunicación (por ejemplo, latencia y tamaño de mensajes) comparado con alternativas como REST.
  • Aplicar mejores prácticas de seguridad, como usar TLS para cifrar la comunicación y validar tokens JWT.
  • Documentar el contrato de servicio (archivo .proto) y asegurar compatibilidad hacia atrás en cambios futuros.

Implementa un servicio de autenticación gRPC con mensajes tipados

En este ejercicio, crearás un servicio de autenticación básico usando gRPC y Protocol Buffers. Sigue estos pasos para construir un sistema funcional que pueda manejar inicio de sesión y validación de tokens.

  1. Define el contrato protobuf: Crea un archivo llamado auth.proto que incluya:
    • Un servicio AuthService con dos métodos RPC: Login (recibe nombre de usuario y contraseña, devuelve un token) y ValidateToken (recibe un token, devuelve validez e ID de usuario).
    • Mensajes tipados para las solicitudes y respuestas, usando tipos de datos apropiados como string e int64.
  2. Genera el código: Usa el compilador protoc para generar código en tu lenguaje preferido (por ejemplo, protoc --go_out=. --go-grpc_out=. auth.proto para Go). Asegúrate de que se generen los stubs para cliente y servidor.
  3. Implementa el servidor: En un archivo de servidor, implementa la lógica para:
    • Login: Simula la verificación de credenciales (por ejemplo, compara con valores hardcodeados) y genera un token JWT simulado (puedes usar una cadena fija para simplificar).
    • ValidateToken: Verifica si el token recibido es válido (por ejemplo, comprueba si coincide con el generado) y devuelve el ID de usuario asociado.
  4. Crea el cliente: En un archivo de cliente, implementa código para:
    • Conectarse al servidor gRPC.
    • Enviar una solicitud Login con credenciales de prueba y imprimir la respuesta.
    • Usar el token recibido para hacer una solicitud ValidateToken y mostrar el resultado.
  5. Ejecuta y prueba: Inicia el servidor, ejecuta el cliente y verifica que las respuestas sean correctas. Prueba con credenciales válidas e inválidas para asegurar el manejo de errores.
Pistas
  • Usa campos opcionales en los mensajes protobuf para facilitar extensiones futuras sin romper compatibilidad.
  • En el servidor, considera usar una map o base de datos en memoria para almacenar tokens y usuarios simulados durante la prueba.
  • Para medir el rendimiento, puedes agregar logs de tiempo en el cliente para calcular la latencia de las llamadas gRPC.

Evalua tu comprension

Completa el quiz interactivo de arriba para ganar XP.

Sigue con Implementación Avanzada de gRPC y Protocol Buffers para Microservicios

Esta lección forma parte de un curso de Cursalo. Revisa su programa y elige entre la compra individual o el acceso a toda la escuela.

Si ya tenías acceso a este curso, entra con tu cuenta: tus derechos y tu progreso se conservan. No necesitas comprarlo de nuevo.

01 / ELEGIR UNA RUTA

El próximo paso

Aprende IA mientras construyes algo que sí necesitas.

Empieza por el curso inicial o explora el catálogo para encontrar una práctica alineada con tu trabajo.