Maison  >  Article  >  cadre php  >  Comment utiliser le framework Hyperf pour l'authentification JWT

Comment utiliser le framework Hyperf pour l'authentification JWT

WBOY
WBOYoriginal
2023-10-24 12:36:231410parcourir

Comment utiliser le framework Hyperf pour lauthentification JWT

Comment utiliser le framework Hyperf pour l'authentification JWT

Introduction :
Hyperf est un framework de coroutine hautes performances basé sur Swoole, offrant des fonctions riches et une évolutivité flexible. JWT (JSON Web Token) est un standard ouvert d'authentification et de transmission d'informations. Dans cet article, nous présenterons comment utiliser l'authentification JWT dans le framework Hyperf et fournirons des exemples de code spécifiques.

1. Installer les packages de dépendances
Tout d'abord, nous devons installer les packages de dépendances hyperf/jwt et lcobucci/jwt. Il peut être installé via Composer, ouvrez le terminal et exécutez la commande suivante :

composer require hyperf/jwt lcobucci/jwt

2. Configurez les informations d'authentification
Dans le framework Hyperf, nous devons configurer les informations pertinentes requises pour l'authentification JWT. Ouvrez le fichier config/autoload/jwt.php et ajoutez les éléments de configuration suivants : config/autoload/jwt.php文件,添加如下配置项:

<?php

return [
    'default' => [
        'valid_seconds' => env('JWT_VALID_SECONDS', 3600), // Token有效期
        'secret' => env('JWT_SECRET', 'your-secret-key'), // 对称加密密钥
        'refresh_ttl' => env('JWT_REFRESH_TTL', 20160), // Token刷新有效期
        'password_key' => env('JWT_PASSWORD_KEY', 'password'), // 密码字段名称
        'blacklist_enabled' => env('JWT_BLACKLIST_ENABLED', true), // Token黑名单启用
        'blacklist_grace_period' => env('JWT_BLACKLIST_GRACE_PERIOD', 60), // Token宽限期
        'claim' => [], // 自定义Claims
    ],
];

三、生成和解析JWT Token
首先,我们需要生成JWT Token。在控制器中引入HyperfJwtJwt类,并通过make()方法生成Token。示例代码如下:

<?php

declare(strict_types=1);

namespace AppController;

use HyperfDiAnnotationInject;
use PsrHttpMessageResponseInterface;

class AuthController extends AbstractController
{
    /**
     * @Inject
     * @var HyperfJwtJwt
     */
    private $jwt;

    public function login(): ResponseInterface
    {
        // 对用户进行验证,验证通过后生成Token
        $userId = 1;
        $token = $this->jwt->make(['user_id' => $userId]);

        return $this->response->json([
            'token' => $token->toString(),
            'expires_at' => $token->getClaim('exp'),
        ]);
    }
}

接下来,我们需要在中间件中验证JWT Token并解析出用户信息。在中间件中引入HyperfJwtMiddlewareJwtMiddleware类,并使用handle()方法进行验证和解析。示例代码如下:

<?php

declare(strict_types=1);

namespace AppMiddleware;

use HyperfDiAnnotationInject;
use HyperfHttpServerContractRequestInterface;
use HyperfHttpServerContractResponseInterface as HttpResponse;
use HyperfUtilsContext;
use HyperfUtilsStr;
use HyperfJwtExceptionTokenValidException;
use HyperfJwtJwtInterface;
use PsrContainerContainerInterface;

class JwtMiddleware
{
    /**
     * @Inject
     * @var HyperfJwtJwt
     */
    private $jwt;

    /**
     * @var JwtInterface
     */
    private $jwtFactory;

    /**
     * @var RequestInterface
     */
    private $request;

    /**
     * @var HttpResponse
     */
    private $response;

    public function __construct(ContainerInterface $container, JwtInterface $jwt, RequestInterface $request, HttpResponse $response)
    {
        $this->jwtFactory = $jwt;
        $this->request = $request;
        $this->response = $response;
    }

    public function handle($request, Closure $next)
    {
        $token = Str::replaceFirst('Bearer ', '', $this->request->header('Authorization')); // 从Header中获取Token
        if (empty($token)) {
            throw new TokenValidException('Token not provided');
        }

        try {
            $token = $this->jwtFactory->parse($token); // 解析Token

            $claims = $token->claims(); // 获取Token中的声明
            Context::set('user_id', $claims->get('user_id')); // 设置用户ID到上下文
        } catch (TokenValidException $e) {
            throw new TokenValidException('Invalid token', $e->getCode(), $e);
        }

        return $next($request);
    }
}

四、使用中间件进行认证
在路由中使用中间件进行JWT认证。打开config/routes.php文件,添加如下路由和中间件配置项:

<?php

use AppMiddlewareJwtMiddleware;

Router::addGroup('/api', function () {
    Router::post('/login', 'AppControllerAuthController@login');

    // 需要认证的路由
    Router::addGroup('/auth', function () {
        Router::get('/info', 'AppControllerAuthController@info');
    }, ['middleware' => [JwtMiddleware::class]]);
});

在上面的示例中,AppControllerAuthController@inforrreee

3. Générez et analysez le jeton JWT

Tout d'abord, nous devons générer le jeton JWT. Introduisez la classe HyperfJwtJwt dans le contrôleur et générez un jeton via la méthode make(). L'exemple de code est le suivant :
rrreee

Ensuite, nous devons vérifier le jeton JWT dans le middleware et analyser les informations utilisateur. Introduisez la classe HyperfJwtMiddlewareJwtMiddleware dans le middleware et utilisez la méthode handle() pour la vérification et l'analyse. L'exemple de code est le suivant : 🎜rrreee🎜 4. Utilisez un middleware pour l'authentification 🎜 Utilisez un middleware dans le routage pour l'authentification JWT. Ouvrez le fichier config/routes.php et ajoutez les éléments de configuration de routage et de middleware suivants : 🎜rrreee🎜Dans l'exemple ci-dessus, AppControllerAuthController@info est l'interface qui nécessite une authentification. Cette interface n'est accessible avec succès que si vous transportez un jeton JWT valide. 🎜🎜Conclusion : 🎜Cet article explique comment utiliser le framework Hyperf pour l'authentification JWT et fournit des exemples de configuration et de code pertinents. Grâce à l'authentification JWT, nous pouvons obtenir des fonctions de sécurité et de vérification des utilisateurs plus élevées dans le framework Hyperf. J'espère que cet article vous sera utile lors de l'utilisation du framework Hyperf pour l'authentification JWT. 🎜

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