رموز JWT في Java: دليل كامل للعمل مع JSON Web Tokens

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

رموز JWT في Java: الإنشاء والتحقق والاستخدام



JSON Web Token (JWT) هي طريقة مدمجة ومكتفية ذاتياً لنقل المعلومات بين الأطراف على شكل كائن JSON. في Java، تُستخدم JWT بنشاط للمصادقة والتفويض وتبادل البيانات في REST API وهندسة الخدمات المصغرة. في هذه المقالة، سنستعرض أشهر مكتبتين للعمل مع JWT في Java — JJWT (Java JWT) من Stormpath و java-jwt من Auth0، بالإضافة إلى التكامل مع Spring Security.



ما هو JWT ولماذا هو مطلوب؟



يتكون JWT من ثلاثة أجزاء مفصولة بنقاط:

  • Header — رأس يحتوي على نوع الرمز وخوارزمية التوقيع (مثل HS256 أو RS256).
  • Payload — الحمولة المفيدة مع الادعاءات (claims)، مثل معرف المستخدم والأدوار وتاريخ انتهاء الصلاحية.
  • Signature — توقيع يتم إنشاؤه بناءً على header و payload والمفتاح السري.


في Java، يُستخدم JWT غالباً من أجل:

  • مصادقة المستخدمين دون حفظ الجلسات على الخادم (stateless).
  • نقل صلاحيات الوصول بين الخدمات المصغرة.
  • رموز لمرة واحدة لإعادة تعيين كلمة المرور أو تأكيد البريد الإلكتروني.


مكتبة JJWT (io.jsonwebtoken)



JJWT هي أشهر مكتبة للعمل مع JWT في Java. إنها سهلة الاستخدام، وتدعم جميع الخوارزميات القياسية (HS256, RS256, ES256) ويتم تحديثها بنشاط.



إضافة JJWT عبر Maven

<dependency>    <groupId>io.jsonwebtoken</groupId>    <artifactId>jjwt-api</artifactId>    <version>0.12.6</version></dependency><dependency>    <groupId>io.jsonwebtoken</groupId>    <artifactId>jjwt-impl</artifactId>    <version>0.12.6</version>    <scope>runtime</scope></dependency><dependency>    <groupId>io.jsonwebtoken</groupId>    <artifactId>jjwt-jackson</artifactId>    <version>0.12.6</version>    <scope>runtime</scope></dependency>


إنشاء رمز JWT

import io.jsonwebtoken.Jwts;import io.jsonwebtoken.SignatureAlgorithm;import io.jsonwebtoken.security.Keys;import javax.crypto.SecretKey;import java.util.Date;

public class JwtExample { public static void main(String[] args) { // إنشاء مفتاح سري آمن لـ HS256 SecretKey key = Keys.secretKeyFor(SignatureAlgorithm.HS256);

String token = Jwts.builder() .subject("user123") .claim("role", "admin") .issuedAt(new Date()) .expiration(new Date(System.currentTimeMillis() + 3600000)) // ساعة واحدة .signWith(key) .compact();

System.out.println("JWT الذي تم إنشاؤه: " + token); }}


التحقق من JWT وتحليله

import io.jsonwebtoken.Claims;import io.jsonwebtoken.Jws;import io.jsonwebtoken.JwtException;import io.jsonwebtoken.Jwts;

public class JwtParserExample { public static void main(String[] args) { String jwtToken = "eyJhbGciOiJIUzI1NiJ9..."; // الرمز الخاص بك SecretKey key = ...; // نفس المفتاح المستخدم في الإنشاء

try { Jws<Claims> claimsJws = Jwts.parser() .verifyWith(key) .build() .parseSignedClaims(jwtToken);

Claims claims = claimsJws.getPayload(); System.out.println("الموضوع: " + claims.getSubject()); System.out.println("الدور: " + claims.get("role")); System.out.println("تاريخ انتهاء الصلاحية: " + claims.getExpiration()); } catch (JwtException e) { System.out.println("الرمز غير صالح: " + e.getMessage()); }

توصيات