Dalam era maklumat hari ini, API bukan lagi sekadar teknologi dalam proses pembangunan perisian, ia telah menjadi komponen yang amat diperlukan dalam aplikasi web moden. Memandangkan antara muka API terdedah kepada serangan, keselamatan adalah salah satu pertimbangan penting semasa membangunkan API. JWT (JSON Web Token) dan JWS (JSON Web Signature) ialah dua kaedah pengesahan yang biasa digunakan untuk mengamankan API.
JWT ialah token keselamatan berasaskan JSON yang digunakan untuk menghantar maklumat antara pihak yang berkomunikasi. Ia terdiri daripada tiga bahagian: pengepala, muatan dan tandatangan. Pengepala menerangkan jenis dan algoritma token, muatan mengandungi maklumat yang diperlukan, dan tandatangan digunakan untuk mengesahkan ketulenan token. Apabila menggunakan JWT, token ini akan digunakan sebagai token pengesahan untuk permintaan API.
JWS ialah standard untuk menambah tandatangan digital pada rentetan teks. Ia membolehkan mesej dihantar dengan selamat dalam persekitaran yang tidak dipercayai dan memastikan pengesahan penghantar dan integriti mesej. JWS biasanya menggunakan algoritma SHA-256 atau SHA-512 untuk menjana tandatangan.
Dalam artikel ini, kami akan meneroka cara menggunakan JWT dan JWS dalam PHP untuk pengesahan API.
Langkah 1: Pasang kebergantungan
Mula-mula, kita perlu memasang beberapa kebergantungan untuk menyokong JWT dan JWS. Pasang dependensi menggunakan arahan berikut:
composer require firebase/php-jwt composer require lcobucci/jwt
Langkah 2: Jana JWT
Sebelum menggunakan JWT, kita perlu menjana JWT terlebih dahulu. Berikut ialah kod PHP yang digunakan untuk menjana JWT:
use FirebaseJWTJWT; // Set up the JWT payload data $payload = array( "sub" => "1234567890", "name" => "John Doe", "iat" => 1516239022 ); // Set up the JWT secret key $secret_key = "YOUR_SECRET_KEY"; // Generate the JWT $jwt = JWT::encode($payload, $secret_key);
Dengan kod ini, kami berjaya menghasilkan JWT. Dalam kod ini kami menetapkan pengepala, muatan dan tandatangan. Pengepala mengandungi jenis dan algoritma JWT, muatan terdiri daripada data yang kami sediakan, seperti ID pengguna, nama pengguna, dsb., dan tandatangan digunakan untuk mengesahkan ketulenan token.
Langkah 3: Sahkan JWT
Langkah seterusnya ialah untuk mengesahkan JWT. Kami perlu menggunakan kod berikut untuk mengesahkan JWT:
use FirebaseJWTJWT; // Set up the JWT secret key $secret_key = "YOUR_SECRET_KEY"; // Get the JWT from the request headers $jwt = getAuthorizationHeader(); // Verify the JWT try { $payload = JWT::decode($jwt, $secret_key, array('HS256')); } catch (Exception $e) { // If the JWT is invalid, return an error response return json_encode(array( 'success' => false, 'message' => 'Invalid JWT' )); } // If the JWT is valid, return a success response with the payload data return json_encode(array( 'success' => true, 'message' => 'Valid JWT', 'payload' => $payload )); // Function to get the Authorization header from the request function getAuthorizationHeader() { $headers = apache_request_headers(); if (isset($headers['Authorization'])) { return $headers['Authorization']; } else { return null; } }
Dalam kod ini, kami menggunakan fungsi JWT::decode() untuk mengesahkan JWT. Jika pengesahan berjaya, objek yang mengandungi data muatan JWT akan dikembalikan, jika tidak, pengecualian yang ditangkap akan dikembalikan dengan respons ralat.
Langkah 4: Jana JWS
Sekarang kita telah menguasai cara menjana dan mengesahkan JWT, kita akan belajar cara menggunakan JWS untuk mendapatkan API. Berikut ialah coretan kod PHP yang menjana JWS:
use LcobucciJWTBuilder; use LcobucciJWTSignerHmacSha256; // Set up the JWT signer $signer = new Sha256(); // Set up the JWT builder $builder = new Builder(); $builder->setIssuer('http://example.com'); $builder->setAudience('http://example.org'); $builder->setId('4f1g23a12aa', true); $builder->setIssuedAt(time()); $builder->setExpiration(time() + 3600); $builder->set('uid', 1); // Sign the JWT $token = $builder->sign($signer, 'YOUR_SECRET_KEY')->getToken(); // Get the token string $jwt = (string) $token;
Langkah 5: Sahkan JWS
Langkah terakhir adalah untuk mengesahkan JWS, kita perlu menggunakan kod berikut:
use LcobucciJWTValidationData; // Set up the JWT secret key $secret_key = "YOUR_SECRET_KEY"; // Get the JWT from the request headers $jwt = getAuthorizationHeader(); // Verify the JWS $token = $signer->loadToken($jwt); $validationData = new ValidationData(); $validationData->setIssuer('http://example.com'); $validationData->setAudience('http://example.org'); $validationData->setId('4f1g23a12aa'); $validationData->setCurrentTime(time()); if (!$token->validate($validationData) || !$token->verify($signer, $secret_key)) { // If the JWS is invalid, return an error response return json_encode(array( 'success' => false, 'message' => 'Invalid JWS' )); } // If the JWS is valid, return a success response with the payload data $payload = $token->getClaims(); return json_encode(array( 'success' => true, 'message' => 'Valid JWS', 'payload' => $payload ));
Dalam coretan ini Dalam kod, kami menggunakan kaedah loadToken() untuk memuatkan JWT ke dalam validator, menggunakan kaedah validate() untuk mengesahkan kandungan JWT dan menggunakan kaedah verify() untuk mengesahkan bahawa Tandatangan JWT betul. Akhir sekali, kami menyediakan respons yang sah yang mengandungi data daripada muatan yang diperoleh daripada JWS jika pengesahan berjaya.
Kesimpulan
Secara keseluruhan, menggunakan JWT dan JWS untuk pengesahan API dalam PHP adalah amalan yang sangat baik. Menggunakan teknik ini, kami boleh memastikan bahawa API hanya diakses oleh pengguna yang dibenarkan dan melindungi API daripada pengguna berniat jahat. Dengan mengikuti langkah di atas, kami boleh melaksanakan pengesahan selamat ini dengan mudah dalam PHP.
Atas ialah kandungan terperinci Cara menggunakan JWT dan JWS untuk pengesahan API dalam PHP. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!