¿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
composer require firebase/php-jwt2. Generar un token JWT
<?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
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
// 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:
Login: Usuario envía credenciales → API devuelve token
Acceso: Cliente incluye token en header
Authorization: Bearer <token>Verificación: API valida token en cada solicitud protegida
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
Publicar un comentario