¿Qué es un token y cómo se utiliza en una API?

 

¿Qué es un token y cómo se utiliza en una API?

¿Qué es un token?

Un token es una cadena de caracteres que actúa como credencial de acceso para autenticar y autorizar a un usuario o aplicación en una API. Funciona como una "llave digital" que permite acceder a recursos protegidos sin necesidad de compartir credenciales sensibles como usuario y contraseña en cada solicitud.

Tipos comunes de tokens:

  • JWT (JSON Web Token): Token auto-contenido con información codificada

  • Access Token: Para acceso a recursos

  • Refresh Token: Para renovar access tokens expirados

  • API Key: Clave simple de identificación

Ejemplo con PHP usando JWT

1. Instalación de dependencias

bash
composer require firebase/php-jwt

2. Generar un token JWT

php
<?php
require 'vendor/autoload.php';

use Firebase\JWT\JWT;
use Firebase\JWT\Key;

class TokenManager {
    private $secretKey = "tu_clave_secreta_muy_segura";
    private $algorithm = 'HS256';
    
    // Generar token JWT
    public function generarToken($userId, $username) {
        $issuedAt = time();
        $expirationTime = $issuedAt + 3600; // Token válido por 1 hora
        
        $payload = [
            'iat' => $issuedAt,         // Tiempo de emisión
            'exp' => $expirationTime,   // Tiempo de expiración
            'data' => [                 // Datos del usuario
                'userId' => $userId,
                'username' => $username
            ]
        ];
        
        return JWT::encode($payload, $this->secretKey, $this->algorithm);
    }
    
    // Verificar token JWT
    public function verificarToken($token) {
        try {
            $decoded = JWT::decode($token, new Key($this->secretKey, $this->algorithm));
            return (array) $decoded;
        } catch (Exception $e) {
            return false;
        }
    }
}

// Ejemplo de uso
$tokenManager = new TokenManager();

// Generar token
$token = $tokenManager->generarToken(123, "usuario_ejemplo");
echo "Token generado: " . $token . "\n\n";

// Verificar token
$verificado = $tokenManager->verificarToken($token);
if ($verificado) {
    echo "Token válido. Datos: ";
    print_r($verificado);
} else {
    echo "Token inválido o expirado";
}
?>

3. API protegida con token

php
<?php
require 'vendor/autoload.php';

use Firebase\JWT\JWT;
use Firebase\JWT\Key;

class ProtectedAPI {
    private $secretKey = "tu_clave_secreta_muy_segura";
    
    // Middleware para verificar token
    public function verificarAutenticacion() {
        $headers = apache_request_headers();
        
        if (!isset($headers['Authorization'])) {
            http_response_code(401);
            echo json_encode(['error' => 'Token no proporcionado']);
            exit;
        }
        
        $authHeader = $headers['Authorization'];
        $token = str_replace('Bearer ', '', $authHeader);
        
        try {
            $decoded = JWT::decode($token, new Key($this->secretKey, 'HS256'));
            return $decoded;
        } catch (Exception $e) {
            http_response_code(401);
            echo json_encode(['error' => 'Token inválido: ' . $e->getMessage()]);
            exit;
        }
    }
    
    // Endpoint protegido
    public function obtenerDatosProtegidos() {
        $userData = $this->verificarAutenticacion();
        
        // Si llegamos aquí, el token es válido
        $datos = [
            'mensaje' => 'Acceso autorizado',
            'usuario' => $userData->data->userId,
            'datos_protegidos' => [
                'informacion_1' => 'Valor secreto 1',
                'informacion_2' => 'Valor secreto 2'
            ]
        ];
        
        header('Content-Type: application/json');
        echo json_encode($datos);
    }
}

// Uso de la API
$api = new ProtectedAPI();
$api->obtenerDatosProtegidos();
?>

4. Cliente consumiendo la API con token

php
<?php
// Cliente que consume la API con token
function consumirAPIProtegida($token, $url) {
    $ch = curl_init();
    
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_HTTPHEADER, [
        'Authorization: Bearer ' . $token,
        'Content-Type: application/json'
    ]);
    
    $response = curl_exec($ch);
    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    
    curl_close($ch);
    
    return [
        'code' => $httpCode,
        'response' => json_decode($response, true)
    ];
}

// Ejemplo de uso del cliente
$token = "tu_token_jwt_aqui"; // Obtenido previamente
$resultado = consumirAPIProtegida($token, 'https://tu-api.com/protegido');

if ($resultado['code'] == 200) {
    echo "Éxito: ";
    print_r($resultado['response']);
} else {
    echo "Error: " . $resultado['code'];
    print_r($resultado['response']);
}
?>

Flujo típico de autenticación:

  1. Login: Usuario envía credenciales → API devuelve token

  2. Acceso: Cliente incluye token en header Authorization: Bearer <token>

  3. Verificación: API valida token en cada solicitud protegida

  4. Renovación: Si el token expira, usar refresh token para obtener uno nuevo

Este ejemplo muestra cómo implementar autenticación basada en tokens JWT de forma segura en PHP.

Comentarios

Entradas más populares de este blog

token

¿Qué es un token y cómo se utiliza en una API?

Generación de Credenciales API