Rumah > Artikel > hujung hadapan web > Memahami JWT
JWT adalah singkatan kepada json web token, ia adalah penggunaan stander terbuka untuk menghantar maklumat antara pihak sebagai objek JSON. Ia padat, selamat URL dan digunakan secara meluas dalam aplikasi web untuk pengesahan dan pertukaran maklumat.
JWT ditandatangani secara digital menggunakan kunci dan rahsia. Kami mengesahkan JWT dengan kunci ini dan tandatangan untuk mengesahkan pengguna. Kebanyakan sistem web menggunakan JWT untuk membenarkan pengguna mengakses sumber tertentu.
JWT mempunyai tiga komponen utama: pengepala, muatan dan tandatangan. Apabila kami mencipta token, kami melepasi pengepala dan muatan, dan kemudian token menjana tandatangan.
Tajuk - Tajuk JWT mengandungi metadata tentang token. Ia termasuk tiga nilai: alg, typ dan kid. Alg menentukan algoritma yang digunakan untuk menandatangani token, taip menunjukkan jenis token, dan kid ialah parameter pilihan yang digunakan untuk mengenal pasti kunci. Sama ada untuk memasukkan kanak-kanak bergantung pada kes penggunaan anda.
{ "alg": "RS256", // allow [HS256,RS256,ES256] "typ": "JWT", // Specific Type Of token "kid": "12345" // Used to indicate which key was used to sign the JWT. This is particularly useful when multiple keys are in use }
Payload - Dalam Payload kami menentukan beberapa data tersuai kebanyakannya menambah data khusus pengguna ke dalam muatan seperti id dan peranan pengguna.
{ "sub": "1234567890", "name": "John Doe", "iat": 1516239022 }
Tandatangan - Tandatangan dijana dengan mengekodkan pengepala dan muatan dengan kunci rahsia (untuk HS256) atau menandatanganinya dengan kunci peribadi (untuk RSA), dan kemudian mencincang hasilnya. Tandatangan ini digunakan untuk mengesahkan token.
Seperti yang kita bincangkan, JWT mempunyai tiga komponen: pengepala, muatan dan tandatangan. Kami menyediakan pengepala dan muatan, dan tandatangan dihasilkan daripadanya. Selepas menggabungkan semua komponen ini, kami mencipta token.
// Header Encoding Base64Url Encode({ "alg": "RS256", "typ": "JWT" }) → eyJhbGciOiAiUlMyNTYiLCAidHlwIjogIkpXVCJ9 // Payload Encoding Base64Url Encode({ "sub": "1234567890", "name": "John Doe", "iat": 1516239022 }) → eyJzdWIiOiAiMTIzNDU2Nzg5MCIsICJuYW1lIjogIkpvaG4gRG9lIiwgImlhdCI6IDE1MTYyMzkwMjJ9 // Concatenate Encoded header and payload ConcatenatedHash = Base64Url Encode(Header) + "." + Base64Url Encode(Payload) //Create Signature Hash = SHA-256(ConcatenatedHash) Signature = RSA Sign(Hash with Private Key) or HS256 Sign(Hash with secrate) // Create Token Token = Base64UrlEncode(Header) +"."+ Base64UrlEncode(Payload) +"."+ Signature
Jadi, proses untuk mencipta JWT adalah seperti berikut: kami mengekod muatan dan pengepala, kemudian menjana tandatangan daripadanya.
Terdahulu, kami membincangkan cara membuat JWT. Sekarang, mari kita bincangkan cara mengesahkan JWT. Proses pengesahan pada asasnya adalah kebalikan daripada penciptaan token. Pertama, kami menyahsulit token menggunakan kunci rahsia atau awam. Kemudian, kami menggabungkan pengepala dan muatan untuk menghasilkan tandatangan. Jika cincang yang dihasilkan sepadan dengan tandatangan, token itu sah; jika tidak, ia tidak sah.
// Token we recive in this formate Token = Base64UrlEncode(Header) +"."+ Base64UrlEncode(Payload) +"."+ Signature // Decrypt Signature TokenHash = RSA Decrypt(Hash with Public Key) or HS256 Sign(Hash with secrate) // Generate Hash From Encoded Header and Payload Hash = SHA-256(Base64UrlEncode(Header) +"."+ Base64UrlEncode(Payload)) // Compare Hash if(TokenHash == Hash) "Valid" else "Not Valid"
JWT menyediakan semua faedah di atas, menjadikannya pilihan popular untuk kebanyakan mekanisme pengesahan untuk membenarkan pengguna. Selain itu, JWT boleh digunakan dengan pelbagai teknik pengesahan, seperti DPoP dan lain-lain.
Untuk menggunakan JWT dalam kod, kami menggunakan pakej npm jsonwebtoken. Terdapat dua kaedah untuk bekerja dengan JWT: kaedah mudah menggunakan kunci rahsia dan kaedah pasangan kunci (menggunakan kunci awam dan peribadi).
import jwt from 'jsonwebtoken'; // Define the type for the payload interface Payload { userId: number; username: string; } // Secret key for signing the JWT const secretKey: string = 'your-very-secure-secret'; // Payload to be included in the JWT const payload: Payload = { userId: 123, username: 'exampleUser' }; // Sign the JWT const token: string = jwt.sign(payload, secretKey, { expiresIn: '1h' }); console.log('Generated Token:', token);
import jwt from 'jsonwebtoken'; // Secret key for signing the JWT const secretKey: string = 'your-very-secure-secret'; // Verify the JWT try { const decoded = jwt.verify(token, secretKey) as Payload; console.log('Decoded Payload:', decoded); } catch (err) { console.error('Token verification failed:', (err as Error).message); }
import * as jwt from 'jsonwebtoken'; import { readFileSync } from 'fs'; // Load your RSA private key const privateKey = readFileSync('private_key.pem', 'utf8'); // Define your payload const payload = { sub: '1234567890', name: 'John Doe', iat: Math.floor(Date.now() / 1000) // Issued at }; // Define JWT sign options const signOptions: jwt.SignOptions = { algorithm: 'RS256', expiresIn: '1h' // Token expiration time }; // Generate the JWT const token = jwt.sign(payload, privateKey, signOptions); console.log('Generated JWT:', token);
import * as jwt from 'jsonwebtoken'; import { readFileSync } from 'fs'; // Load your RSA public key const publicKey = readFileSync('public_key.pem', 'utf8'); // Define JWT verify options const verifyOptions: jwt.VerifyOptions = { algorithms: ['RS256'] // Specify the algorithm used }; try { // Verify the JWT const decoded = jwt.verify(token, publicKey, verifyOptions) as jwt.JwtPayload; console.log('Decoded Payload:', decoded); } catch (error) { console.error('Error verifying token:', error); }
Ringkasnya, JSON Web Token (JWT) menghantar maklumat dengan selamat antara pihak menggunakan format padat. Penandatanganan dan pengesahan RSA melibatkan penggunaan kunci persendirian untuk menandatangani dan kunci awam untuk pengesahan. Contoh TypeScript menggambarkan penjanaan JWT dengan kunci RSA peribadi dan mengesahkannya dengan kunci RSA awam, memastikan pengesahan berasaskan token yang selamat dan integriti data.
Atas ialah kandungan terperinci Memahami JWT. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!