Maison  >  Article  >  cadre php  >  Utilisation de la validation JWT dans ThinkPHP6

Utilisation de la validation JWT dans ThinkPHP6

PHPz
PHPzoriginal
2023-06-20 23:36:093224parcourir

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.

  • PHP 7.2 ou supérieur
  • ThinkPHP 6.0.0 ou supérieur
  • Bibliothèque PHP Firebase JWT

É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

Étape 3 : Vérifiez le jeton dans le middleware

Maintenant que nous avons créé la classe Token pour gérer le travail lié à JWT, nous devons vérifier l'utilisateur JWT dans le middleware. L'utilisation d'un middleware facilite l'interception et la définition des réponses dans le code du contrôleur de votre application, et vous pouvez séparer le code en différentes classes pour une meilleure gestion et modification.

Créez le fichier Jwt.php dans le répertoire app/middleware et ajoutez le code suivant :

rrreee

Dans ce middleware, nous utilisons verifyToken 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!

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