يرمز JWT إلى رمز ويب json، وهو يُستخدم بشكل مفتوح لنقل المعلومات بين الأطراف ككائن JSON. إنه مدمج وآمن لعنوان URL ويستخدم على نطاق واسع في تطبيقات الويب للمصادقة وتبادل المعلومات.
يتم توقيع JWTs رقميًا باستخدام المفاتيح والأسرار. نقوم بالتحقق من JWT باستخدام هذه المفاتيح والتوقيع لمصادقة المستخدم. تستخدم معظم أنظمة الويب JWTs للسماح للمستخدمين بالوصول إلى موارد معينة.
يتكون JWT من ثلاثة مكونات رئيسية: الرأس والحمولة والتوقيع. عندما نقوم بإنشاء رمز مميز، نقوم بتمرير الرأس والحمولة، ثم يقوم الرمز المميز بإنشاء التوقيع.
الرأس - يحتوي رأس JWT على بيانات وصفية حول الرمز المميز. ويتضمن ثلاث قيم: alg، وtyp، وkid. يحدد alg الخوارزمية المستخدمة لتوقيع الرمز المميز، ويشير typ إلى نوع الرمز المميز، وكيد هو معلمة اختيارية تستخدم لتحديد المفتاح. يعتمد تضمين الطفل على حالة الاستخدام الخاصة بك.
{ "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 نحدد بعض البيانات المخصصة، وفي الغالب نضيف بيانات خاصة بالمستخدم إلى الحمولة مثل معرف المستخدم والدور.
{ "sub": "1234567890", "name": "John Doe", "iat": 1516239022 }
التوقيع - يتم إنشاء التوقيع عن طريق تشفير الرأس والحمولة بمفتاح سري (لـ HS256) أو توقيعهما بمفتاح خاص (لـ RSA)، ثم تجزئة النتيجة. يُستخدم هذا التوقيع للتحقق من الرمز المميز.
كما ناقشنا، يتكون JWT من ثلاثة مكونات: الرأس، والحمولة، والتوقيع. نحن نقدم الرأس والحمولة، ويتم إنشاء التوقيع منهم. بعد دمج كل هذه المكونات، نقوم بإنشاء الرمز المميز.
// 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
لذا، فإن عملية إنشاء JWT هي كما يلي: نقوم بتشفير الحمولة والترويسات، ثم نقوم بإنشاء التوقيع منها.
لقد ناقشنا سابقًا كيفية إنشاء JWT. الآن، دعونا نناقش كيفية التحقق من JWT. عملية التحقق هي في الأساس عكس عملية إنشاء الرمز المميز. أولاً، نقوم بفك تشفير الرمز المميز باستخدام مفتاح سري أو عام. بعد ذلك، نقوم بربط الرأس والحمولة لإنشاء التوقيع. إذا كانت التجزئة التي تم إنشاؤها تطابق التوقيع، فإن الرمز المميز صالح؛ وإلا فهو غير صالح.
// 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 جميع المزايا المذكورة أعلاه، مما يجعله خيارًا شائعًا لمعظم آليات المصادقة لتخويل المستخدمين. بالإضافة إلى ذلك، يمكن استخدام JWT مع تقنيات المصادقة المختلفة، مثل DPoP وغيرها.
لاستخدام JWT في التعليمات البرمجية، نستخدم حزمة jsonwebtoken npm. هناك طريقتان للعمل مع JWTs: الطريقة المباشرة باستخدام مفتاح سري وطريقة زوج المفاتيح (باستخدام المفاتيح العامة والخاصة).
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); }
باختصار، تقوم JSON Web Tokens (JWTs) بنقل المعلومات بشكل آمن بين الأطراف باستخدام تنسيق مضغوط. يتضمن التوقيع والتحقق من RSA استخدام مفتاح خاص للتوقيع ومفتاح عام للتحقق. توضح أمثلة TypeScript إنشاء JWT باستخدام مفتاح RSA خاص والتحقق منه باستخدام مفتاح RSA عام، مما يضمن المصادقة الآمنة القائمة على الرمز المميز وتكامل البيانات.
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3