Avec le développement d'Internet, le nombre d'utilisateurs d'applications Web a progressivement augmenté, et les enjeux de sécurité sont devenus de plus en plus importants. L'authentification est un élément important de la sécurité des applications Web, car seuls les utilisateurs authentifiés peuvent accéder aux ressources nécessitant des autorisations.
JSON Web Token (JWT) est un jeton d'authentification léger et autonome qui constitue un excellent moyen de transférer en toute sécurité des informations entre des applications Web. Le schéma d'authentification JWT convient aux systèmes distribués et aux applications monopage.
ThinkPHP est un framework PHP populaire qui fournit de nombreux outils pour développer des applications Web sécurisées. Dans cet article, nous expliquerons comment utiliser JWT pour l'authentification dans ThinkPHP6 afin d'améliorer la sécurité de votre application.
Environnement de développement et dépendances
Avant de commencer, nous devons nous assurer que l'environnement de développement a été correctement configuré. Voici les environnements et dépendances utilisés dans cet article. Veuillez modifier en conséquence en fonction de vos besoins.
Étape 1 : Installer la bibliothèque PHP Firebase JWT
L'installation de la bibliothèque PHP Firebase JWT est la première étape pour utiliser le schéma d'authentification JWT. Cette bibliothèque nous aidera à créer, signer et vérifier des JWT.
Nous pouvons installer la bibliothèque PHP Firebase JWT en utilisant Composer. Saisissez la commande suivante dans la ligne de commande :
composer require firebase/php-jwt
Étape 2 : Créer une classe Token
Afin de faciliter la gestion et l'utilisation de JWT, nous créons une classe nommée Token pour gérer la vérification JWT sous tous ses aspects. Cette classe comprendra des fonctions telles que la création de jetons, la vérification des jetons et l'obtention d'informations sur les jetons.
Créez le fichier Token.php dans le répertoire app/common et ajoutez le code suivant :
<?php namespace appcommon; use FirebaseJWTJWT; class Token { private static $key = 'your_secret_key'; private static $alg = 'HS256'; public static function createToken($data, $expiration = 3600) { $payload = [ 'iss' => 'localhost', 'sub' => 'token', 'iat' => time(), 'exp' => time() + $expiration, 'data' => $data ]; return JWT::encode($payload, self::$key, self::$alg); } public static function decodeToken($token) { return JWT::decode($token, self::$key, [self::$alg]); } public static function getDataByToken($token) { $decoded = self::decodeToken($token); if (isset($decoded->data)) { return $decoded->data; } else { return false; } } public static function verifyToken($token) { $result = false; try { $decoded = self::decodeToken($token); $result = true; } catch (Exception $e) { // Invalid token } return $result; } }
Dans le code, on utilise le FirebaseJWTJWT
bibliothèque Les méthodes encode()
et decode()
sont utilisées pour créer et analyser JWT. $key
est la clé que nous utilisons pour signer le JWT, et $alg
est l'algorithme que nous choisissons. Dans la méthode createToken()
, nous utilisons les quatre clés (iss, iat, exp et sub) de la charge utile JWT et ajoutons des données
personnalisées. Le paramètre $expiration
spécifie le délai d'expiration du JWT. Par conséquent, JWT ne peut être utilisé que pendant la période de validité. FirebaseJWTJWT
库中的encode()
和decode()
方法来创建和解析 JWT。$key
是我们用于签名 JWT 的密钥,$alg
是我们选择的算法。 在createToken()
方法中,我们使用 JWT 负载中的四个键(iss,iat,exp和sub)并添加自定义data
。$expiration
参数指定 JWT 的过期时间。因此,JWT 只能在有效期内使用。
步骤3:在中间件中验证令牌
现在我们已经创建了 Token 类以处理 JWT 相关的工作,我们需要在中间件中验证用户 JWT。使用中间件可以方便地在应用程序的控制器代码中拦截和设置响应,并且可以将代码分离到不同的类中以便更好地管理和修改。
在 app/middleware 目录下创建Jwt.php文件,并添加以下代码:
<?php namespace appmiddleware; use appcommonToken; use thinkexceptionHttpResponseException; use thinkResponse; class Jwt { public function handle($request, Closure $next) { if (!$request->header('Authorization')) { return json(['code' => 401, 'msg' => 'Unauthorized']); } $header = $request->header('Authorization'); $token = substr($header, 7); if (Token::verifyToken($token)) { $request->data = Token::getDataByToken($token); return $next($request); } else { return json(['code' => 401, 'msg' => 'Unauthorized']); } } }
在此中间件中,我们使用 Token 类中的verifyToken()
方法来验证 JWT。 此方法将返回 true 或 false,表示令牌是否有效。 如果有效,我们将使用getDataByToken()
方法来获取 JWT 的数据部分并将其存储在$request->data
中。 这样,控制器就可以使用此数据。
步骤4:设置路由
现在,我们已经创建了中间件,我们需要将其应用到适当的路由上。
假设我们要保护/api/user
的路由,我们需要在routepi.php
文件中按如下方式设置路由:
use appmiddlewareJwt; Route::group('api', function() { Route::get('user', 'UserController@getUserInfo')->middleware(Jwt::class); });
请注意,在此路由中,我们将Jwt
中间件作为参数传递给middleware()
方法。这是UserController
中的getUserInfo()
方法的示例代码。
<?php namespace appcontroller; use appcommonToken; class UserController { public function getUserInfo() { $data = request()->data; ... } ... }
在控制器中,您可以通过调用$request->data
rrreee
Dans ce middleware, nous utilisonsverifyToken dans la classe Token ( )
pour vérifier le JWT. Cette méthode renverra vrai ou faux indiquant si le jeton est valide. Si elle est valide, nous utiliserons la méthode getDataByToken()
pour obtenir la partie données du JWT et la stockerons dans $request->data
. Ces données sont ensuite disponibles pour le responsable du traitement. Étape 4 : Configurer les routes #🎜🎜##🎜🎜#Maintenant que nous avons créé le middleware, nous devons l'appliquer aux routes appropriées. #🎜🎜##🎜🎜# En supposant que nous souhaitons protéger la route de /api/user
, nous devons définir la route dans le fichier route pi.php
comme suit : # 🎜🎜#rrreee#🎜🎜#Veuillez noter que dans cette route, nous passons le middleware Jwt
en paramètre à la méthode middleware()
. Ceci est l'exemple de code pour la méthode getUserInfo()
dans UserController
. #🎜🎜#rrreee#🎜🎜#Dans le contrôleur, vous pouvez accéder aux données stockées dans le JWT authentifié en appelant $request->data
. #🎜🎜##🎜🎜#Conclusion#🎜🎜##🎜🎜#La méthode d'authentification JWT peut rendre votre application Web plus sécurisée et fiable. Dans cet article, nous avons expliqué comment utiliser la bibliothèque PHP Firebase JWT pour créer et valider des JWT dans ThinkPHP6. #🎜🎜##🎜🎜# Nous avons créé une classe appelée Token, qui est utilisée pour gérer le travail lié à JWT, et ajouté un middleware pour valider JWT et définir les données. Enfin, nous configurons le code de routage et de contrôleur qui utilise ce middleware pour accéder aux données stockées dans le JWT. #🎜🎜##🎜🎜#L'objectif principal de l'introduction de l'authentification JWT est de garantir que les ressources de l'application ne peuvent être utilisées que par des utilisateurs authentifiés. J'espère que cet article vous a aidé à comprendre comment utiliser l'authentification JWT pour sécuriser votre application ! #🎜🎜#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!