OAuth 2.0 y autorización JWT en C++: guía paso a paso para principiantes

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Introducción a OAuth 2.0 y JWT en C++

\n\n

Las aplicaciones web modernas y las API rara vez prescinden de sistemas de autorización. Los dos estándares más populares — OAuth 2.0 y JWT (JSON Web Token) — se han convertido en la base de seguridad para millones de servicios. En este artículo, analizaremos cómo implementar una autorización básica OAuth 2.0 con tokens JWT en el lenguaje C++. Aprenderá cómo funcionan estos protocolos y verá ejemplos de código listos para usar que puede adaptar a su proyecto.

\n\n

El artículo está dirigido a desarrolladores principiantes que ya están familiarizados con los fundamentos de C++ (clases, funciones, trabajo en red) y desean agregar autorización segura a sus aplicaciones. No utilizaremos bibliotecas de terceros para el servidor HTTP; todos los ejemplos serán en C++ puro con dependencias mínimas.

\n\n

¿Qué es OAuth 2.0 y para qué sirve?

\n\n

OAuth 2.0 es un protocolo de autorización que permite a las aplicaciones obtener acceso limitado a los recursos del usuario sin transmitir su contraseña. Imagine que desea darle a una aplicación acceso a sus fotos en un servidor. En lugar de ingresar su nombre de usuario y contraseña, pasa por un Authorization Server que emite un token temporal. La aplicación utiliza este token para acceder a los recursos.

\n\n

Roles principales en OAuth 2.0:

\n
    \n
  • Resource Owner — el usuario, propietario de los datos.
  • \n
  • Client — la aplicación que solicita acceso.
  • \n
  • Authorization Server — el servidor que emite tokens después de la autenticación.
  • \n
  • Resource Server — el servidor que almacena datos protegidos (por ejemplo, una API).
  • \n
\n\n

En C++ implementaremos una versión simplificada del Authorization Server y Resource Server, utilizando JWT como token de acceso.

\n\n

JWT: estructura y principio de funcionamiento

\n\n

JWT (JSON Web Token) es una forma compacta y autónoma de transmitir información entre partes en forma de objeto JSON. El token consta de tres partes separadas por puntos:

\n\n
header.payload.signature
\n\n

Header contiene el tipo de token y el algoritmo de firma (generalmente HMAC SHA256 o RSA). Payload es la carga útil: identificador de usuario, tiempo de vida del token, roles, etc. Signature es la firma que verifica la integridad de los datos.

\n\n

Ejemplo de creación de JWT en C++ sin bibliotecas (simplificado):

\n\n
#include <iostream>\n#include <sstream>\n#include <vector>\n#include <openssl/sha.h>\n#include <openssl/hmac.h>\n\nstd::string base64_encode(const std::string &input) {\n    // Implementación simplificada de Base64 (para el ejemplo)\n    static const char* lookup = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";\n    std::string result;\n    // ... código de codificación ...\n    return result;\n}\n\nstd::string create_jwt(const std::string &payload, const std::string &secret) {\n    std::string header = R"({"alg":"HS256","typ":"JWT"})";\n    std::string header_b64 = base64_encode(header);\n    std::string payload_b64 = base64_encode(payload);\n    std::string data = header_b64 + "." + payload_b64;\n    \n    unsigned char* sig = HMAC(EVP_sha256(), secret.c_str(), secret.length(), \n                              (unsigned char*)data.c_str(), data.length(), NULL, NULL);\n    std::string sig_b64 = base64_encode(std::string((char*)sig, 32));\n    \n    return data + "." + sig_b64;\n}\n\nint main() {\n    std::string payload = R"({"user_id":123,"role":"admin","exp":1700000000})";\n    std::string token = create_jwt(payload, "my_secret_key");\n    std::cout << "JWT: " << token << std::endl;\n    return 0;\n}
\n\n

Este código crea un JWT con el encabezado HS256 y la carga útil. En proyectos reales, utilice bibliotecas probadas como jwt-cpp o libjwt, pero para comprender la esencia, este enfoque también es válido.

Blogs

Book Recommendations