Maison  >  Article  >  cadre php  >  Comment utiliser ThinkPHP6 pour l'authentification JWT ?

Comment utiliser ThinkPHP6 pour l'authentification JWT ?

王林
王林original
2023-06-12 12:18:102431parcourir

JWT (JSON Web Token) est un mécanisme léger d'authentification et d'autorisation qui utilise des objets JSON comme jetons de sécurité pour transmettre en toute sécurité les informations d'identité des utilisateurs entre plusieurs systèmes. ThinkPHP6 est un framework MVC efficace et flexible basé sur le langage PHP. Il fournit de nombreux outils et fonctions utiles, notamment le mécanisme d'authentification JWT. Dans cet article, nous expliquerons comment utiliser ThinkPHP6 pour l'authentification JWT afin de garantir la sécurité et la fiabilité des applications Web.

  1. Installer et configurer l'extension JWT

Tout d'abord, nous devons installer l'extension JWT dans notre application. Il peut être installé en ajoutant des dépendances dans le fichier composer.json :

{
    "require": {
        "firebase/php-jwt": "^5.0.0"
    }
}

Ensuite, exécutez la commande suivante pour l'installer :

composer install

Une fois l'installation terminée, nous devons installez-le dans le fichier de configuration Configure JWT. Créez le fichier jwt.php dans le répertoire de configuration et ajoutez le contenu suivant :

<?php
return [
    'key' => 'your-secret-key',
    'alg' => 'HS256',
    'exp' => 7200, // token过期时间,单位秒
];

où "key" est une chaîne utilisée pour générer la clé de signature du jeton JWT, et "alg" est le JWT signature Pour le nom de l'algorithme, on peut choisir des algorithmes tels que "HS256", "HS512", "RS256", etc. "exp" est le délai d'expiration du token JWT, calculé en secondes.

  1. Implémentation du contrôleur d'authentification JWT

Ensuite, nous devons créer un contrôleur d'authentification JWT pour implémenter l'authentification JWT. Créez le fichier AuthController.php dans le répertoire app/controller et ajoutez le contenu suivant :

<?php
namespace appcontroller;

use FirebaseJWTJWT;
use thinkacadeDb;

class AuthController
{
    public function login()
    {
        //在这里处理用户登陆逻辑
        //...
        
        //登陆成功后生成JWT token并返回给客户端

        $secretKey = config('jwt.key'); // 获取JWT生成签名的密钥
        $alg = config('jwt.alg'); // 获取JWT加密算法
        $payload = [
            'sub' => $user->id, // 存储用户ID
            'exp' => time() + config('jwt.exp'), // 设定过期时间
        ];
        $jwt = JWT::encode($payload, $secretKey, $alg); // 生成JWT令牌
        return ['token' => $jwt]; // 返回JWT Token给客户端
    }

    public function dashboard()
    {
        //检查请求中的JWTToken是否有效,并返回用户信息

        $jwtToken = request()->header('Authorization'); // 获取JWT Token
        if (!$jwtToken) {
            // 如果token不存在,直接返回错误信息
            return ['msg' => '未验证身份,请先登录'];
        }
        $jwtInfo = JWT::decode($jwtToken, config('jwt.key'), [config('jwt.alg')]); // 使用JWT解密Token
        $userId = $jwtInfo->sub; // 获取token中存储的用户ID,用来查询用户信息
        $user = Db::table('users')->where('id', $userId)->find(); // 查询用户信息
        if (!$user) {
            // 用户不存在,直接返回错误信息
            return ['msg' => '用户不存在'];
        }
        // 返回用户信息
        return ['username' => $user['username'], 'email' => $user['email']];
    }
}

Dans le code du contrôleur ci-dessus, nous avons implémenté deux fonctions : l'une pour la connexion de l'utilisateur et l'autre pour obtenir Informations utilisateur. Pendant le processus de connexion, nous générons un jeton JWT et le renvoyons au client pour authentification lors des demandes ultérieures. Dans la méthode du tableau de bord, nous vérifions si l'en-tête Authorization de la demande contient le jeton JWT, et utilisons le JWT pour déchiffrer le jeton et vérifier si l'identité de l'utilisateur est valide.

  1. Ajouter un middleware d'authentification JWT

Enfin, nous devons ajouter un middleware d'authentification JWT à l'application pour protéger l'API qui nécessite une interface d'authentification. Créez le fichier JwtAuth.php dans le répertoire app/middleware et ajoutez le contenu suivant :

<?php
namespace appmiddleware;

use FirebaseJWTJWT;
use thinkacadeConfig;

class JwtAuth
{
    public function handle($request, Closure $next)
    {
        //检查请求中的JWTToken是否有效

        $jwtToken = $request->header('Authorization'); // 获取JWT Token
        if (!$jwtToken) {
            // 如果token不存在,直接返回错误信息
            return response(['msg' => '未授权的API请求!'], 401);
        }
        try {
            $jwtInfo = JWT::decode($jwtToken, Config::get('jwt.key'), [Config::get('jwt.alg')]); // 使用JWT解密Token
            $request->jwtInfo = $jwtInfo; // 将解密后的JWT信息存储在请求对象中,后续控制器可以使用
            return $next($request); // 继续后续请求处理
        } catch (Exception $e) {
            // JWT Token过期或者解密失败,返回错误信息
            return response(['msg' => 'JWT Token无效或已过期!'], 401);
        }
    }
}

Dans le code ci-dessus, nous avons vérifié si l'en-tête Authorization de la requête contient un jeton JWT valide. Si le jeton JWT n'est pas valide ou a expiré, nous renvoyons une réponse HTTP non autorisée, sinon nous poursuivons le traitement de la demande ultérieure et stockons les informations du jeton JWT dans l'objet de demande pour une utilisation par les contrôleurs suivants.

Enfin, nous devons utiliser le middleware d'authentification JWT dans le routage de l'application pour protéger l'interface API qui nécessite une authentification. Par exemple, nous ajoutons le code suivant au fichier routes/api.php :

<?php
use appmiddlewareJwtAuth;

// 需要JWT认证的API接口
Route::get('dashboard', 'AuthController@dashboard')->middleware(JwtAuth::class);

Dans le code ci-dessus, nous protégeons la méthode du tableau de bord à l'aide du middleware JwtAuth pour garantir que seuls ceux disposant de jetons JWT valides demandent à y accéder.

Conclusion

Dans cet article, nous avons présenté comment utiliser ThinkPHP6 pour l'authentification JWT afin de garantir la sécurité et la fiabilité des applications Web. Nous avons d'abord installé et configuré l'extension JWT, puis implémenté le contrôleur d'authentification JWT et le middleware d'authentification JWT, et enfin utilisé le middleware d'authentification JWT dans le routage de l'application pour protéger les interfaces API qui nécessitent une authentification. Grâce à ces étapes, nous pouvons facilement implémenter le mécanisme d'authentification JWT dans les applications ThinkPHP6 pour garantir la sécurité et la fiabilité des applications Web.

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn