Par Evan Sims
Ce guide montre comment intégrer Auth0 à une API backend en PHP à l’aide du SDK PHP d’Auth0. Nous vous recommandons de vous connecter pour suivre ce guide de démarrage rapide avec des exemples configurés pour votre compte.
Dans la section APIs de l’Auth0 Dashboard, cliquez sur Create API. Entrez un nom et un identifiant pour votre API, par exemple https://quickstarts/api. Vous utiliserez ensuite cet identifiant comme audience lors de la configuration de la vérification du Jeton d’accès. Laissez Signing Algorithm à RS256.
Par défaut, votre API utilise RS256 comme algorithme de signature des jetons. Comme RS256 utilise une paire de clés publique/privée, les jetons sont vérifiés à l’aide de la clé publique de votre compte Auth0. La clé publique est au format JSON Web Key Set (JWKS) et est accessible ici.
Définir les autorisations
Les autorisations vous permettent de définir comment accéder aux ressources au nom de l’utilisateur à l’aide d’un jeton d’accès donné. Par exemple, vous pouvez choisir d’accorder un accès en lecture à la ressource messages si les utilisateurs ont le niveau d’accès de gestionnaire, et un accès en écriture à cette ressource s’ils ont le niveau d’accès d’administrateur.
Vous pouvez définir les autorisations permises dans la vue Permissions de la section APIs de l’Auth0 Dashboard.
Cet exemple utilise le scope read:messages.
Cet exemple montre :
- Comment vérifier la présence d’un JSON Web Token (JWT) dans l’en-tête
Authorization d’une requête HTTP entrante.
- Comment vérifier si le jeton est valide à l’aide du jeu de clés Web JSON (JWKS) de votre compte Auth0. Pour en savoir plus sur la validation des jetons d’accès, consultez Valider les jetons d’accès.
Intégrer votre API PHP backend
Créons un exemple d’application qui autorise, au moyen d’une API backend écrite en PHP, un jeton signé par Auth0. Nous adopterons ici une approche simple, adaptée au format de cette documentation. Cela dit, vous devriez consulter l’application Quickstart sur GitHub pour voir un exemple plus complet.
Installation du client HTTP et des fabriques de messages
Le SDK PHP d’Auth0 prend en charge de nombreuses normes PHP-FIG afin d’offrir une interopérabilité maximale avec l’architecture de votre projet, mais deux sont particulièrement importantes : PSR-17 et PSR-18. Ces normes vous permettent d’“intégrer” les composants réseau de votre choix pour gérer les messages et les requêtes. Vous devrez installer des bibliothèques compatibles dans votre projet pour que le SDK puisse les utiliser.
La bibliothèque réseau la plus répandue pour PHP est Guzzle, bien qu’il en existe plusieurs autres dans la communauté PHP. Utilisons Guzzle pour cet exemple d’application :
composer require guzzlehttp/guzzle guzzlehttp/psr7 http-interop/http-factory-guzzle
Le SDK PHP d’Auth0 nécessite Composer, un outil de gestion des dépendances pour PHP. Composer vous permet de déclarer les bibliothèques dont votre projet a besoin et les installe pour vous. Assurez-vous que Composer est installé et accessible depuis votre terminal avant de poursuivre.
Exécutez la commande shell suivante dans le répertoire de votre projet pour installer le SDK PHP d’Auth0 :
composer require auth0/auth0-php
Cette commande créera un dossier vendor dans votre projet et téléchargera toutes les dépendances nécessaires pour utiliser le SDK PHP d’Auth0. Elle créera également un fichier vendor/autoload.php, utilisé dans l’exemple pour charger toutes les classes nécessaires au bon fonctionnement de votre application. Il est important d’inclure ce fichier autoload dans votre projet pour que le SDK fonctionne.
Pour commencer, créons un fichier .env à la racine du répertoire de votre projet pour y stocker la configuration de notre application exemple et y définir les variables d’environnement :
Comme PHP ne peut pas lire notre fichier .env à lui seul, nous devons installer une bibliothèque pour nous aider. Bien que nous utilisions une bibliothèque précise pour les besoins de notre application d’exemple, n’importe quel chargeur ‘dotenv’ conviendra dans une application réelle. À partir du répertoire de notre projet, exécutez la commande shell suivante pour installer la bibliothèque :
composer require vlucas/phpdotenv
Ensuite, créons le fichier source PHP que nous utiliserons pour ces exemples de code, index.php, puis configurons une instance du SDK PHP d’Auth0 pour notre application d’exemple :
<?php
// Importer le chargeur automatique Composer pour rendre les classes du SDK accessibles :
require 'vendor/autoload.php';
// Charger nos variables d'environnement depuis le fichier .env :
(Dotenv\Dotenv::createImmutable(__DIR__))->load();
// Instancier maintenant la classe Auth0 avec notre configuration :
$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,
]);
Authentification de l’utilisateur
Pour cet exemple d’application, nous nous concentrons sur l’autorisation. Il existe de nombreuses façons d’authentifier vos utilisateurs avant qu’ils n’accèdent à votre API backend aux fins d’autorisation, par exemple en utilisant la bibliothèque SPA.js d’Auth0. Cette approche est illustrée dans ce projet GitHub associé à l’application Quickstart. Quelle que soit l’approche choisie, cet exemple d’application exige que vous lui transmettiez votre Jeton d’accès au moyen d’un paramètre de requête ou d’un en-tête pour fonctionner.
Autoriser un jeton d’accès
Nous devons d’abord extraire le JSON Web Token (JWT) de la requête HTTP entrante. Recherchons un paramètre ?token dans une requête GET, ou un en-tête HTTP_AUTHORIZATION ou Authorization.
// 👆 Nous continuons à partir des étapes précédentes. Ajoutez ceci à votre fichier index.php.
$jwt = $_GET['token'] ?? $_SERVER['HTTP_AUTHORIZATION'] ?? $_SERVER['Authorization'] ?? null;
Ensuite, décodons le jeton, s’il y en a un :
// 👆 Nous continuons à partir des étapes précédentes. Ajoutez ceci à votre fichier index.php.
// Si un jeton est présent, le traiter.
if ($jwt !== null) {
// Supprimer les espaces en début et fin de la chaîne du jeton.
$jwt = trim($jwt);
// Supprimer le préfixe 'Bearer ' s'il est présent, dans le cas où nous recevrions un en-tête Authorization qui l'utilise.
if (substr($jwt, 0, 7) === 'Bearer ') {
$jwt = substr($jwt, 7);
}
// Tenter de décoder le jeton :
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) {
// Le jeton n'était pas valide. Affichons le message d'erreur du SDK Auth0.
// Dans une application réelle, on voudrait probablement afficher une erreur personnalisée ici.
die($exception->getMessage());
}
}
Selon la façon dont vous configurez le routage de votre API, l’intégration précise de ces vérifications peut varier légèrement, mais le principe reste le même : vérifiez le jeton et, si votre point de terminaison d’API nécessite une autorisation, refusez l’accès si le jeton n’est pas valide ou n’est pas accepté :
// 👆 Nous continuons à partir des étapes précédentes. Ajoutez ceci à votre fichier index.php.
// La requête est-elle autorisée ?
if (defined('ENDPOINT_AUTHORIZED')) {
// Répondre avec une réponse JSON :
echo json_encode([
'authorized' => true,
'data' => $token->toArray()
], JSON_PRETTY_PRINT);
exit;
}
// Retourner un statut HTTP 401 Non autorisé :
http_response_code(401);
// Répondre avec une réponse JSON :
echo json_encode([
'authorized' => false,
'error' => [
'message' => 'You are NOT authorized to be here!'
]
], JSON_PRETTY_PRINT);
Cela fonctionne, mais dans une application réelle, il est préférable d’utiliser la mise en cache pour éviter d’atteindre les limites de débit d’Auth0 ou de ralentir l’application avec des requêtes réseau inutiles. Le SDK PHP d’Auth0 prend en charge une interface de mise en cache appelée PSR-6, à laquelle vous pouvez brancher n’importe quelle bibliothèque de mise en cache compatible afin que le SDK s’intègre harmonieusement à votre architecture.
Pour notre exemple, utilisons la bibliothèque Symfony Cache Component. À partir du répertoire racine du projet, exécutez la commande shell suivante :
composer require symfony/cache
Ensuite, nous devons mettre à jour notre SdkConfiguration pour indiquer au SDK de l’utiliser :
// ✋ Insérez ceci AVANT la gestion des jetons ajoutée à l'étape ci-dessus, afin que le SDK utilise le cache.
$tokenCache = new \Symfony\Component\Cache\Adapter\FilesystemAdapter();
$auth0->configuration()->setTokenCache($tokenCache);
Notre application d’exemple met maintenant en cache les requêtes réseau liées aux jetons.
Que pouvez-vous faire ensuite ?