Skip to main content
Por Evan Sims
En esta guía se muestra cómo integrar Auth0 con una API de backend en PHP mediante el SDK de PHP de Auth0. Le recomendamos iniciar sesión para seguir esta guía de inicio rápido con ejemplos configurados para su cuenta.
¿Es la primera vez que usa Auth0? Aprenda cómo funciona Auth0 y lea sobre cómo implementar la autenticación y autorización de API mediante el marco OAuth 2.0.

Configurar las APIs de Auth0

Crear una API

En la sección APIs del Auth0 Dashboard, haga clic en Create API. Proporcione un nombre y un identificador para su API, por ejemplo, https://quickstarts/api. Más adelante, usará el identificador como audience al configurar la verificación del Token de acceso. Deje Signing Algorithm en RS256.
Crear una API
De forma predeterminada, su API usa RS256 como algoritmo para firmar tokens. Como RS256 usa un par de claves privada/pública, los tokens se verifican con la clave pública de su cuenta de Auth0. La clave pública está en formato JSON Web Key Set (JWKS) y puede acceder a ella aquí.

Definir permisos

Los permisos le permiten definir cómo se puede acceder a los recursos en nombre del usuario con un token de acceso determinado. Por ejemplo, puede optar por conceder acceso de lectura al recurso messages si los usuarios tienen el nivel de acceso de gerente, y acceso de escritura a ese recurso si tienen el nivel de acceso de administrador. Puede definir los permisos permitidos en la vista Permissions de la sección APIs de Auth0 Dashboard.
Configurar permisos
Este ejemplo usa el scope read:messages.
Este ejemplo muestra:
  • Cómo comprobar si hay un JWT en el encabezado Authorization de una solicitud HTTP entrante.
  • Cómo comprobar si el token es válido mediante el JSON Web Key Set (JWKS) de su cuenta de Auth0. Para obtener más información sobre cómo validar tokens de acceso, consulte Validate Access Tokens.

Integración de la API de backend en PHP

Vamos a crear una aplicación de ejemplo que autorice, mediante una API de backend escrita en PHP, un token firmado por Auth0. Aquí adoptaremos un enfoque sencillo, apropiado para este formato. Aun así, consulta la aplicación Quickstart complementaria en GitHub para ver un ejemplo más completo.

Instalación del cliente HTTP y las fábricas de mensajería

El SDK de PHP de Auth0 es compatible con muchos estándares de PHP-FIG para ofrecer la máxima interoperabilidad con la arquitectura de tu proyecto, pero dos especialmente importantes son PSR-17 y PSR-18. Estos estándares te permiten “conectar” los componentes de red que elijas para gestionar la mensajería y las solicitudes. Tendrás que instalar bibliotecas compatibles en tu proyecto para que el SDK pueda utilizarlas. La biblioteca de red más utilizada para PHP es Guzzle, aunque en la comunidad de PHP hay muchas otras entre las que elegir. Usemos Guzzle para esta aplicación de ejemplo:
composer require guzzlehttp/guzzle guzzlehttp/psr7 http-interop/http-factory-guzzle

Instalación del SDK de PHP

El SDK de PHP de Auth0 requiere Composer, una herramienta de gestión de dependencias para PHP. Composer le permite declarar las bibliotecas de las que depende su proyecto y las instala por usted. Asegúrese de que Composer esté instalado y accesible desde su shell antes de continuar. Ejecute el siguiente comando de shell en el directorio de su proyecto para instalar el SDK de PHP de Auth0:
composer require auth0/auth0-php
Esto creará una carpeta vendor dentro de tu proyecto y descargará todas las dependencias necesarias para usar el SDK de PHP de Auth0. También creará un archivo vendor/autoload.php, que se usa en el ejemplo para cargar todas las clases necesarias para que tu aplicación funcione. Es importante que incluyas este archivo de carga automática en tu proyecto para que el SDK funcione.

Configura el SDK

Para empezar, crea un archivo .env en la raíz del directorio de tu proyecto para almacenar la configuración de nuestra aplicación de ejemplo y completar las variables de entorno: Como PHP no puede leer por sí solo nuestro archivo .env, necesitaremos instalar una biblioteca que nos ayude. Aunque para nuestra aplicación de ejemplo usaremos una biblioteca concreta, en una aplicación real funcionará cualquier cargador de ‘dotenv’ que prefieras. Desde el directorio de nuestro proyecto, ejecuta el siguiente comando de shell para instalar la biblioteca:
composer require vlucas/phpdotenv
A continuación, vamos a crear el archivo fuente PHP que usaremos para estos ejemplos de código, index.php, y a configurar una instancia del SDK de PHP de Auth0 para nuestra aplicación de ejemplo:
<?php

// Importar el Autoloader de Composer para que las clases del SDK sean accesibles:
require 'vendor/autoload.php';

// Cargar las variables de entorno desde el archivo .env:
(Dotenv\Dotenv::createImmutable(__DIR__))->load();

// Instanciar la clase Auth0 con nuestra configuración:
$auth0 = new \Auth0\SDK\Auth0([
    'strategy' => \Auth0\SDK\Configuration\SdkConfiguration::STRATEGY_API,
    'domain' => $_ENV['AUTH0_DOMAIN'],
    'clientId' => $_ENV['AUTH0_CLIENT_ID'],
    'clientSecret' => $_ENV['AUTH0_CLIENT_SECRET'],
    'audience' => ($_ENV['AUTH0_AUDIENCE'] ?? null) !== null ? [trim($_ENV['AUTH0_AUDIENCE'])] : null,
]);

Autenticación del usuario

En esta aplicación de ejemplo, nos centramos en la autorización. Hay varias formas de autenticar a tus usuarios antes de que lleguen a tu API de backend para su autorización, como usar la biblioteca SPA.js de Auth0. Este enfoque se muestra en este proyecto de GitHub complementario de la aplicación Quickstart. Independientemente del enfoque que elijas, para que esta aplicación de ejemplo funcione, debes pasarle tu Token de acceso mediante un parámetro de la solicitud o un encabezado.

Autorizar un token de acceso

Primero, debemos extraer el JSON Web Token (JWT) de la solicitud HTTP recibida. Busquemos el parámetro ?token en una solicitud GET o en las cabeceras HTTP_AUTHORIZATION o Authorization.
// 👆 Continuamos desde los pasos anteriores. Añade esto a tu archivo index.php.

$jwt = $_GET['token'] ?? $_SERVER['HTTP_AUTHORIZATION'] ?? $_SERVER['Authorization'] ?? null;
A continuación, decodifiquemos el token, si hay alguno:
// 👆 Continuamos desde los pasos anteriores. Añade esto a tu archivo index.php.

// Si hay un token presente, procesarlo.
if ($jwt !== null) {
    // Eliminar espacios en blanco de la cadena del token.
    $jwt = trim($jwt);

    // Eliminar el prefijo 'Bearer ' si está presente, en caso de que el encabezado Authorization lo incluya.
    if (substr($jwt, 0, 7) === 'Bearer ') {
        $jwt = substr($jwt, 7);
    }

    // Intentar decodificar el token:
    try {
        $token = $auth0->decode($jwt, null, null, null, null, null, null, \Auth0\SDK\Token::TYPE_TOKEN);
        define('ENDPOINT_AUTHORIZED', true);
    } catch (\Auth0\SDK\Exception\InvalidTokenException $exception) {
        // El token no era válido. Mostrar el mensaje de error del SDK de Auth0.
        // En una aplicación real, probablemente se querría mostrar un error personalizado.
        die($exception->getMessage());
    }
}
Según cómo configures el enrutamiento de tu API, la forma exacta de integrar estas comprobaciones puede variar un poco, pero el principio es el mismo: comprobar el token y, si el endpoint de la API requiere autorización, denegar el acceso si el token no es válido o no resulta aceptable:
// 👆 Continuamos desde los pasos anteriores. Añade esto a tu archivo index.php.

// ¿Está autorizada la solicitud?
if (defined('ENDPOINT_AUTHORIZED')) {
    // Responder con una respuesta JSON:
    echo json_encode([
        'authorized' => true,
        'data' => $token->toArray()
    ], JSON_PRETTY_PRINT);

    exit;
}

// Devolver un estado HTTP 401 No autorizado:
http_response_code(401);

// Responder con una respuesta JSON:
echo json_encode([
    'authorized' => false,
    'error' => [
        'message' => 'You are NOT authorized to be here!'
    ]
], JSON_PRETTY_PRINT);

Almacenamiento en caché

Esto funciona, pero en una aplicación real conviene usar almacenamiento en caché para asegurarnos de no alcanzar los límites de tasa de Auth0 ni ralentizar la aplicación con solicitudes de red innecesarias. El SDK de Auth0 para PHP admite una interfaz de almacenamiento en caché llamada PSR-6, en la que puedes integrar cualquier biblioteca de caché compatible para que el SDK encaje sin problemas en tu arquitectura. Para este ejemplo, usemos la biblioteca Symfony Cache Component. Desde el directorio raíz del proyecto, ejecuta el siguiente comando de shell:
composer require symfony/cache
A continuación, debemos actualizar nuestra SdkConfiguration para indicarle al SDK que la utilice:
// ✋ Inserta esto ANTES del manejo de tokens que agregamos en el paso anterior, para que el SDK utilice la caché.

$tokenCache = new \Symfony\Component\Cache\Adapter\FilesystemAdapter();
$auth0->configuration()->setTokenCache($tokenCache);
Nuestra aplicación de ejemplo ahora almacenará en caché las solicitudes de red relacionadas con los tokens.