"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > فهم JWT

فهم JWT

تم النشر بتاريخ 2024-08-24
تصفح:849

ما هو JWT؟

يرمز 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 هي كما يلي: نقوم بتشفير الحمولة والترويسات، ثم نقوم بإنشاء التوقيع منها.

Understanding the JWT

التحقق من رموز 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

  1. الأمان - يتم توقيع JWTs رقميًا، مما يضمن سلامة البيانات وصحتها
  2. مدمجة - أجهزة JWT صغيرة الحجم، مما يجعلها فعالة في النقل عبر الشبكة.
  3. قائمة بذاتها - تحتوي JWTs على جميع المعلومات الضرورية عن المستخدم، مما يقلل الحاجة إلى الاستعلام عن قاعدة البيانات عدة مرات.

يوفر JWT جميع المزايا المذكورة أعلاه، مما يجعله خيارًا شائعًا لمعظم آليات المصادقة لتخويل المستخدمين. بالإضافة إلى ذلك، يمكن استخدام JWT مع تقنيات المصادقة المختلفة، مثل DPoP وغيرها.

كيفية استخدام JWT في التعليمات البرمجية الخاصة بك

لاستخدام 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);
}

باستخدام طريقة KeyPair

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 عام، مما يضمن المصادقة الآمنة القائمة على الرمز المميز وتكامل البيانات.

بيان الافراج تم نشر هذه المقالة على: https://dev.to/dkmen/understanding-the-jwt-3pl5?1 إذا كان هناك أي انتهاك، يرجى الاتصال بـ [email protected] لحذفه
أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3