رموز JWT في Java: دليل شامل للعمل مع JSON Web Tokens
\n\nJSON 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
في Java، يُستخدم JWT غالباً من أجل:
\n- \n
- المصادقة والتفويض في REST API (خاصة مع Spring Security). \n
- نقل المعلومات بين الخدمات المصغرة. \n
- تنفيذ الدخول الموحد (Single Sign-On - SSO). \n
مكتبة JJWT (io.jsonwebtoken)
\n\nJJWT هي واحدة من أشهر وأفضل المكتبات الموثقة في 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
\nimport 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 وتحليله
\nimport 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)