Rumah  >  Artikel  >  rangka kerja php  >  Bagaimana untuk menggunakan ThinkPHP6 untuk pengesahan JWT?

Bagaimana untuk menggunakan ThinkPHP6 untuk pengesahan JWT?

王林
王林asal
2023-06-12 12:18:102430semak imbas

JWT (JSON Web Token) ialah mekanisme pengesahan dan kebenaran ringan yang menggunakan objek JSON sebagai token keselamatan untuk menghantar maklumat identiti pengguna dengan selamat antara berbilang sistem. ThinkPHP6 ialah rangka kerja MVC yang cekap dan fleksibel berdasarkan bahasa PHP Ia menyediakan banyak alat dan fungsi yang berguna, termasuk mekanisme pengesahan JWT. Dalam artikel ini, kami akan memperkenalkan cara menggunakan ThinkPHP6 untuk pengesahan JWT bagi memastikan keselamatan dan kebolehpercayaan aplikasi web.

  1. Pasang dan konfigurasikan sambungan JWT

Pertama, kami perlu memasang sambungan JWT dalam aplikasi kami. Ia boleh dipasang dengan menambah kebergantungan dalam fail composer.json:

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

Kemudian jalankan arahan berikut untuk memasangnya:

composer install

Setelah pemasangan selesai, kita perlu mengkonfigurasi JWT dalam konfigurasi fail. Cipta fail jwt.php dalam direktori konfigurasi dan tambah kandungan berikut:

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

di mana "kunci" ialah rentetan yang digunakan untuk menjana kunci tandatangan token JWT dan "alg" ialah algoritma tandatangan JWT Nama, kita boleh memilih algoritma seperti "HS256", "HS512", "RS256", dll. "exp" ialah masa tamat tempoh token JWT, dikira dalam beberapa saat.

  1. Laksanakan pengawal pengesahan JWT

Seterusnya, kita perlu mencipta pengawal pengesahan JWT untuk melaksanakan pengesahan JWT. Cipta fail AuthController.php dalam direktori aplikasi/pengawal dan tambah kandungan berikut:

<?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']];
    }
}

Dalam kod pengawal di atas, kami telah melaksanakan dua fungsi: satu adalah log masuk pengguna, dan satu lagi adalah untuk mendapatkan maklumat pengguna . Semasa proses log masuk, kami menjana token JWT dan mengembalikannya kepada pelanggan untuk pengesahan dalam permintaan seterusnya. Dalam kaedah papan pemuka, kami menyemak sama ada pengepala Kebenaran permintaan mengandungi token JWT dan menggunakan JWT untuk menyahsulit token dan mengesahkan sama ada identiti pengguna adalah sah.

  1. Tambah perisian tengah pengesahan JWT

Akhir sekali, kami perlu menambah perisian tengah pengesahan JWT pada aplikasi untuk melindungi antara muka API yang memerlukan pengesahan. Cipta fail JwtAuth.php dalam direktori app/middleware dan tambah kandungan berikut:

<?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);
        }
    }
}

Dalam kod di atas, kami menyemak sama ada pengepala Kebenaran permintaan mengandungi token JWT yang sah. Jika token JWT tidak sah atau telah tamat tempoh, kami mengembalikan respons HTTP Tanpa Kebenaran, jika tidak, kami meneruskan pemprosesan permintaan seterusnya dan menyimpan maklumat token JWT dalam objek permintaan untuk digunakan oleh pengawal seterusnya.

Akhir sekali, kita perlu menggunakan perisian tengah pengesahan JWT dalam penghalaan aplikasi untuk melindungi antara muka API yang memerlukan pengesahan. Sebagai contoh, kami menambah kod berikut dalam fail route/api.php:

<?php
use appmiddlewareJwtAuth;

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

Dalam kod di atas, kami telah melindungi kaedah papan pemuka menggunakan middleware JwtAuth untuk memastikan hanya terdapat permintaan dengan token JWT yang sah untuk mengaksesnya.

Kesimpulan

Dalam artikel ini, kami memperkenalkan cara menggunakan ThinkPHP6 untuk pengesahan JWT bagi memastikan keselamatan dan kebolehpercayaan aplikasi web. Kami mula-mula memasang dan mengkonfigurasi sambungan JWT, kemudian melaksanakan pengawal pengesahan JWT dan perisian tengah pengesahan JWT, dan akhirnya menggunakan perisian tengah pengesahan JWT dalam penghalaan aplikasi untuk melindungi antara muka API yang memerlukan pengesahan. Melalui langkah ini, kami boleh melaksanakan mekanisme pengesahan JWT dengan mudah dalam aplikasi ThinkPHP6 untuk memastikan keselamatan dan kebolehpercayaan aplikasi web.

Atas ialah kandungan terperinci Bagaimana untuk menggunakan ThinkPHP6 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