Introducción a OAuth 2.0 y JWT en C++
\n\nLas 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\nEl 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\nOAuth 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\nRoles 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
En C++ implementaremos una versión simplificada del Authorization Server y Resource Server, utilizando JWT como token de acceso.
\n\nJWT: estructura y principio de funcionamiento
\n\nJWT (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\nheader.payload.signature\n\nHeader 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\nEjemplo 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\nEste 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.