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

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

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

ابدأ الدورة

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

\n\n

JSON Web Token (JWT) هو معيار مفتوح (RFC 7519) يحدد طريقة مضغوطة ومكتفية ذاتياً لنقل المعلومات بين الأطراف على شكل كائن JSON. في Java، توجد عدة مكتبات ناضجة للعمل مع JWT تسمح بإنشاء وتوقيع والتحقق وفك تشفير الرموز. في هذه المقالة، سنستعرض بالتفصيل ثلاث مكتبات رئيسية: JJWT وAuth0 java-jwt وNimbus JOSE + JWT، بالإضافة إلى تحليل أفضل الممارسات لاستخدامها.

\n\n

ما هو JWT ولماذا هو مطلوب في Java؟

\n\n

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

\n
    \n
  • Header — يحتوي على معلومات حول نوع الرمز وخوارزمية التوقيع (مثل HS256 أو RS256).
  • \n
  • Payload — يحتوي على الادعاءات (claims): القياسية (iss, sub, exp, iat) والبيانات المخصصة.
  • \n
  • Signature — يتم إنشاؤه عن طريق تجزئة header + payload باستخدام مفتاح سري أو زوج RSA/ECDSA.
  • \n
\n\n

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

\n
    \n
  • المصادقة والتفويض في REST API (خاصة مع Spring Security).
  • \n
  • نقل المعلومات بين الخدمات المصغرة.
  • \n
  • تنفيذ الدخول الموحد (Single Sign-On - SSO).
  • \n
\n\n

مكتبة JJWT (io.jsonwebtoken)

\n\n

JJWT هي واحدة من أشهر وأفضل المكتبات الموثقة في Java. تدعم جميع خوارزميات التوقيع والتشفير الحديثة، وتوفر واجهة fluent API مريحة.

\n\n

التثبيت

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

إنشاء JWT باستخدام JJWT

\n
import io.jsonwebtoken.Jwts;\nimport io.jsonwebtoken.SignatureAlgorithm;\nimport io.jsonwebtoken.security.Keys;\nimport javax.crypto.SecretKey;\nimport java.util.Date;\n\npublic class JwtExample {\n    public static void main(String[] args) {\n        // توليد مفتاح آمن لـ HS256\n        SecretKey key = Keys.secretKeyFor(SignatureAlgorithm.HS256);\n\n        String jwt = Jwts.builder()\n                .subject("user123")\n                .issuer("https://pythonlib.ru")\n                .issuedAt(new Date())\n                .expiration(new Date(System.currentTimeMillis() + 3600000)) // ساعة واحدة\n                .claim("role", "ADMIN")\n                .signWith(key)\n                .compact();\n\n        System.out.println("JWT: " + jwt);\n    }\n}
\n\n

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

\n
import io.jsonwebtoken.Claims;\nimport io.jsonwebtoken.Jws;\nimport io.jsonwebtoken.Jwts;\n\npublic class JwtParser {\n    public static void main(String[] args) {\n        String jwt = "eyJhbGciOiJIUzI1NiJ9..."; // الرمز الخاص بك\n        SecretKey key = ...; // نفس المفتاح المستخدم للتوقيع\n\n        try {\n            Jws<Claims> claimsJws = Jwts.parser()\n                    .verifyWith(key)\n                    .build()\n                    .parseSignedClaims(jwt);\n            \n            Claims claims = claimsJws.getPayload();\n            String subject = claims.getSubject();\n            String role = claims.get("role", String.class);\n            \n            System.out.println("Subject: " + subject);\n            System.out.println("Role: " + role);\n        } catch (Exception e)                    

توصيات