Maison > Article > développement back-end > Comment utiliser JWT et JWS pour l'authentification API en PHP
À l'ère de l'information d'aujourd'hui, l'API n'est plus seulement une technologie dans le processus de développement logiciel, elle est devenue un composant indispensable dans les applications Web modernes. Les interfaces API étant vulnérables aux attaques, la sécurité est l’une des considérations importantes lors du développement d’API. JWT (JSON Web Token) et JWS (JSON Web Signature) sont deux méthodes d'authentification couramment utilisées pour sécuriser les API.
JWT est un jeton de sécurité basé sur JSON utilisé pour transférer des informations entre les parties communicantes. Il se compose de trois parties : en-tête, charge utile et signature. L'en-tête décrit le type de jeton et l'algorithme, la charge utile contient les informations requises et la signature est utilisée pour vérifier l'authenticité du jeton. Lors de l'utilisation de JWT, ce jeton sera utilisé comme jeton d'authentification pour les requêtes API.
JWS est une norme permettant d'ajouter des signatures numériques aux chaînes de texte. Il permet aux messages d'être transmis en toute sécurité dans des environnements non fiables et garantit l'authentification de l'expéditeur et l'intégrité des messages. JWS utilise généralement les algorithmes SHA-256 ou SHA-512 pour générer des signatures.
Dans cet article, nous explorerons comment utiliser JWT et JWS en PHP pour l'authentification API.
Étape 1 : Installer les dépendances
Tout d'abord, nous devons installer certaines dépendances pour prendre en charge JWT et JWS. Installez les dépendances à l'aide de la commande suivante :
composer require firebase/php-jwt composer require lcobucci/jwt
Étape 2 : Générer JWT
Avant d'utiliser JWT, nous devons d'abord générer le JWT. Ci-dessous le code PHP utilisé pour générer le JWT :
use FirebaseJWTJWT; // Set up the JWT payload data $payload = array( "sub" => "1234567890", "name" => "John Doe", "iat" => 1516239022 ); // Set up the JWT secret key $secret_key = "YOUR_SECRET_KEY"; // Generate the JWT $jwt = JWT::encode($payload, $secret_key);
Avec ce code, nous avons réussi à générer un JWT. Dans ce code, nous définissons les en-têtes, la charge utile et la signature. L'en-tête contient le type et l'algorithme du JWT, la charge utile est constituée des données que nous fournissons, telles que l'ID utilisateur, le nom d'utilisateur, etc., et la signature est utilisée pour vérifier l'authenticité du jeton.
Étape 3 : Vérifiez le JWT
L'étape suivante consiste à vérifier ce JWT. Nous devons utiliser le code suivant pour vérifier le JWT :
use FirebaseJWTJWT; // Set up the JWT secret key $secret_key = "YOUR_SECRET_KEY"; // Get the JWT from the request headers $jwt = getAuthorizationHeader(); // Verify the JWT try { $payload = JWT::decode($jwt, $secret_key, array('HS256')); } catch (Exception $e) { // If the JWT is invalid, return an error response return json_encode(array( 'success' => false, 'message' => 'Invalid JWT' )); } // If the JWT is valid, return a success response with the payload data return json_encode(array( 'success' => true, 'message' => 'Valid JWT', 'payload' => $payload )); // Function to get the Authorization header from the request function getAuthorizationHeader() { $headers = apache_request_headers(); if (isset($headers['Authorization'])) { return $headers['Authorization']; } else { return null; } }
Dans ce code, nous utilisons la fonction JWT::decode() pour vérifier le JWT. Si la validation réussit, un objet contenant les données de charge utile JWT sera renvoyé, sinon l'exception interceptée sera renvoyée avec une réponse d'erreur.
Étape 4 : Générer JWS
Maintenant que nous maîtrisons comment générer et valider un JWT, nous allons apprendre à utiliser JWS pour sécuriser une API. Ce qui suit est un extrait de code PHP qui génère JWS :
use LcobucciJWTBuilder; use LcobucciJWTSignerHmacSha256; // Set up the JWT signer $signer = new Sha256(); // Set up the JWT builder $builder = new Builder(); $builder->setIssuer('http://example.com'); $builder->setAudience('http://example.org'); $builder->setId('4f1g23a12aa', true); $builder->setIssuedAt(time()); $builder->setExpiration(time() + 3600); $builder->set('uid', 1); // Sign the JWT $token = $builder->sign($signer, 'YOUR_SECRET_KEY')->getToken(); // Get the token string $jwt = (string) $token;
Étape 5 : Vérifier JWS
La dernière étape consiste à vérifier le JWS, nous devons utiliser le code suivant :
use LcobucciJWTValidationData; // Set up the JWT secret key $secret_key = "YOUR_SECRET_KEY"; // Get the JWT from the request headers $jwt = getAuthorizationHeader(); // Verify the JWS $token = $signer->loadToken($jwt); $validationData = new ValidationData(); $validationData->setIssuer('http://example.com'); $validationData->setAudience('http://example.org'); $validationData->setId('4f1g23a12aa'); $validationData->setCurrentTime(time()); if (!$token->validate($validationData) || !$token->verify($signer, $secret_key)) { // If the JWS is invalid, return an error response return json_encode(array( 'success' => false, 'message' => 'Invalid JWS' )); } // If the JWS is valid, return a success response with the payload data $payload = $token->getClaims(); return json_encode(array( 'success' => true, 'message' => 'Valid JWS', 'payload' => $payload ));
Dans ce code, nous chargeons le JWT en utilisant la méthode loadToken() Dans le validateur, utilisez la méthode validate() pour vérifier le contenu du JWT et la méthode verify() pour vérifier que la signature JWT est correcte. Enfin, nous fournissons une réponse valide contenant les données de la charge utile obtenue de JWS si la validation a réussi.
Conclusion
Dans l'ensemble, utiliser JWT et JWS pour l'authentification API en PHP est une très bonne pratique. Grâce à ces techniques, nous pouvons garantir que l'API n'est accessible qu'aux utilisateurs autorisés et protéger l'API des utilisateurs malveillants. En suivant les étapes ci-dessus, nous pouvons facilement implémenter cette authentification sécurisée en PHP.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!