Rumah  >  Artikel  >  rangka kerja php  >  Cara menggunakan rangka kerja Hyperf untuk pengesahan JWT

Cara menggunakan rangka kerja Hyperf untuk pengesahan JWT

WBOY
WBOYasal
2023-10-24 12:36:231515semak imbas

Cara menggunakan rangka kerja Hyperf untuk pengesahan JWT

Cara menggunakan rangka kerja Hyperf untuk pengesahan JWT

Pengenalan:
Hyperf ialah rangka kerja coroutine berprestasi tinggi berdasarkan Swoole, menyediakan fungsi yang kaya dan kebolehskalaan yang fleksibel. JWT (JSON Web Token) ialah standard terbuka untuk mengesahkan dan menghantar maklumat. Dalam artikel ini, kami akan memperkenalkan cara menggunakan pengesahan JWT dalam rangka kerja Hyperf dan memberikan contoh kod khusus.

1. Pasang pakej kebergantungan
Pertama, kita perlu memasang pakej kebergantungan hyperf/jwt dan lcobucci/jwt. Ia boleh dipasang melalui Komposer, buka terminal dan jalankan arahan berikut:

composer require hyperf/jwt lcobucci/jwt

2. Konfigurasikan maklumat pengesahan
Dalam rangka kerja Hyperf, kita perlu mengkonfigurasi maklumat berkaitan yang diperlukan untuk pengesahan JWT. Buka fail config/autoload/jwt.php dan tambahkan item konfigurasi berikut: 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. Jana dan hurai JWT Token

Mula-mula, kita perlu menjana Token JWT. Perkenalkan kelas HyperfJwtJwt ke dalam pengawal dan jana Token melalui kaedah make(). Kod sampel adalah seperti berikut:
rrreee

Seterusnya, kita perlu mengesahkan Token JWT dalam middleware dan menghuraikan maklumat pengguna. Perkenalkan kelas HyperfJwtMiddlewareJwtMiddleware ke dalam middleware dan gunakan kaedah handle() untuk pengesahan dan penghuraian. Kod sampel adalah seperti berikut: 🎜rrreee🎜 4. Gunakan middleware untuk pengesahan 🎜 Gunakan middleware dalam penghalaan untuk pengesahan JWT. Buka fail config/routes.php dan tambahkan penghalaan dan item konfigurasi middleware berikut: 🎜rrreee🎜Dalam contoh di atas, AppControllerAuthController@info ialah antara muka yang memerlukan pengesahan. Antara muka ini hanya boleh berjaya diakses apabila membawa Token JWT yang sah. 🎜🎜Kesimpulan: 🎜Artikel ini memperkenalkan cara menggunakan rangka kerja Hyperf untuk pengesahan JWT dan menyediakan contoh konfigurasi dan kod yang berkaitan. Melalui pengesahan JWT, kami boleh mencapai keselamatan yang lebih tinggi dan fungsi pengesahan pengguna dalam rangka kerja Hyperf. Saya harap artikel ini akan membantu anda apabila menggunakan rangka kerja Hyperf untuk pengesahan JWT. 🎜

Atas ialah kandungan terperinci Cara menggunakan rangka kerja Hyperf untuk pengesahan JWT. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn