Dengan perkembangan Internet, bilangan pengguna aplikasi Web telah meningkat secara beransur-ansur, dan isu keselamatan menjadi semakin penting. Pengesahan adalah bahagian penting dalam keselamatan aplikasi web kerana hanya pengguna yang disahkan boleh mengakses sumber yang memerlukan kebenaran.
JSON Web Token (JWT) ialah token pengesahan yang ringan dan serba lengkap yang merupakan cara terbaik untuk memindahkan maklumat antara aplikasi web dengan selamat. Skim pengesahan JWT sesuai untuk sistem teragih dan aplikasi satu halaman.
ThinkPHP ialah rangka kerja PHP popular yang menyediakan banyak alatan untuk membangunkan aplikasi web selamat. Dalam artikel ini, kami akan membincangkan cara menggunakan JWT untuk pengesahan dalam ThinkPHP6 untuk meningkatkan keselamatan aplikasi anda.
Persekitaran pembangunan dan kebergantungan
Sebelum kita bermula, kita perlu memastikan bahawa persekitaran pembangunan telah disediakan dengan betul. Berikut ialah persekitaran dan kebergantungan yang digunakan dalam artikel ini. Sila tukar mengikut keperluan anda.
Langkah 1 : Pasang Firebase JWT Pustaka PHP
Memasang pustaka PHP JWT Firebase ialah langkah pertama untuk menggunakan skim pengesahan JWT. Pustaka ini akan membantu kami membuat, menandatangani dan mengesahkan JWT.
Kami boleh memasang pustaka Firebase JWT PHP menggunakan Composer. Masukkan arahan berikut dalam baris arahan:
composer require firebase/php-jwt
Langkah 2: Cipta kelas Token
Untuk memudahkan pengurusan dan penggunaan JWT, kami mencipta kelas bernama Token untuk mengendalikan pelbagai aspek pengesahan JWT . Kelas ini akan merangkumi fungsi seperti mencipta token, mengesahkan token dan mendapatkan maklumat token.
Buat fail Token.php dalam direktori app/common dan tambahkan kod berikut:
<?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; } }
Dalam kod, kami menggunakan kaedah FirebaseJWTJWT
dan encode()
daripada decode()
perpustakaan untuk mencipta dan menghuraikan JWT. $key
ialah kunci yang kami gunakan untuk menandatangani JWT dan $alg
ialah algoritma yang kami pilih. Dalam kaedah createToken()
, kami menggunakan empat kekunci daripada muatan JWT (iss, iat, exp dan sub) dan menambah data
tersuai. Parameter $expiration
menentukan masa tamat tempoh JWT. Oleh itu, JWT hanya boleh digunakan dalam tempoh sah.
Langkah 3: Sahkan token dalam middleware
Sekarang kami telah mencipta kelas Token untuk mengendalikan kerja berkaitan JWT, kami perlu mengesahkan pengguna JWT dalam middleware. Menggunakan perisian tengah memudahkan untuk memintas dan menetapkan respons dalam kod pengawal aplikasi anda, dan anda boleh memisahkan kod tersebut ke dalam kelas yang berbeza untuk pengurusan dan pengubahsuaian yang lebih baik.
Buat fail Jwt.php dalam direktori app/middleware dan tambah kod berikut:
<?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']); } } }
Dalam middleware ini, kami menggunakan kaedah verifyToken()
dalam kelas Token untuk mengesahkan JWT . Kaedah ini akan mengembalikan benar atau salah yang menunjukkan sama ada token itu sah. Jika sah, kami akan menggunakan kaedah getDataByToken()
untuk mendapatkan bahagian data JWT dan menyimpannya dalam $request->data
. Data ini kemudiannya tersedia kepada pengawal.
Langkah 4: Sediakan laluan
Sekarang kita telah mencipta perisian tengah, kita perlu menerapkannya pada laluan yang sesuai.
Dengan mengandaikan kami ingin melindungi laluan /api/user
, kami perlu menyediakan laluan dalam fail routepi.php
seperti berikut:
use appmiddlewareJwt; Route::group('api', function() { Route::get('user', 'UserController@getUserInfo')->middleware(Jwt::class); });
Perhatikan bahawa dalam laluan ini, kami akan Jwt
Middleware diluluskan sebagai parameter kepada kaedah middleware()
. Berikut ialah kod sampel untuk kaedah UserController
dalam getUserInfo()
.
<?php namespace appcontroller; use appcommonToken; class UserController { public function getUserInfo() { $data = request()->data; ... } ... }
Dalam pengawal, anda boleh mengakses data yang disimpan dalam JWT yang disahkan dengan memanggil $request->data
.
Kesimpulan
Kaedah pengesahan JWT boleh menjadikan aplikasi web anda lebih selamat dan boleh dipercayai. Dalam artikel ini, kami membincangkan cara menggunakan perpustakaan Firebase JWT PHP untuk mencipta dan mengesahkan JWT dalam ThinkPHP6.
Kami mencipta kelas yang dipanggil Token, yang digunakan untuk mengendalikan kerja berkaitan JWT, dan menambahkan perisian tengah untuk mengesahkan JWT dan menetapkan data. Akhir sekali, kami menyediakan kod penghalaan dan pengawal yang menggunakan perisian tengah ini untuk mengakses data yang disimpan dalam JWT.
Tujuan utama memperkenalkan pengesahan JWT adalah untuk memastikan sumber dalam aplikasi hanya boleh digunakan oleh pengguna yang disahkan. Saya harap artikel ini membantu anda memahami cara menggunakan pengesahan JWT untuk menjamin permohonan anda!
Atas ialah kandungan terperinci Menggunakan pengesahan JWT dalam ThinkPHP6. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!