OAuth 2.0 وتفويض JWT في Java: عمليًا
\n\nنادرًا ما تخلو تطبيقات الويب الحديثة وواجهات API من آليات المصادقة والتفويض. المعياران الأكثر شيوعًا — OAuth 2.0 و JWT (JSON Web Token) — يسمحان بنقل بيانات المستخدم بشكل آمن ومنح الوصول إلى الموارد. في هذه المقالة، سنشرح كيفية تنفيذ OAuth 2.0 وتفويض JWT في Java من خلال مثال عملي باستخدام Spring Boot. ستتعلم كيفية إعداد خادم التفويض، وإنشاء رموز JWT المميزة والتحقق منها، بالإضافة إلى حماية نقاط النهاية لواجهة REST API الخاصة بك.
\n\nما هما OAuth 2.0 و JWT: نظرة عامة مختصرة
\nOAuth 2.0 هو بروتوكول وصول مفوض يسمح للتطبيقات الخارجية بالحصول على وصول محدود إلى موارد المستخدم دون نقل بيانات اعتماده. يُستخدم على نطاق واسع لتسجيل الدخول عبر شبكات التواصل الاجتماعي (Google, Facebook) ولحماية واجهات API.
\nJWT (JSON Web Token) هو تنسيق رمز مميز مضغوط ومكتفي ذاتيًا يحتوي على معلومات حول المستخدم (المطالبات) ويتم توقيعه للتحقق من سلامته. غالبًا ما يُستخدم JWT كرمز وصول (access token) في OAuth 2.0، حيث لا يتطلب تخزينًا على الخادم ويسهل نقله في رؤوس HTTP.
\nعمليًا، يحدد OAuth 2.0 التدفق (flow) للحصول على الرمز المميز، بينما يحدد JWT تنسيق الرمز المميز نفسه. معًا، يشكلان نظام تفويض قويًا وآمنًا.
\n\nإعداد مشروع Spring Boot مع التبعيات
\nللبدء، سننشئ مشروع Spring Boot أساسيًا. سنستخدم Spring Security و Spring Web ومكتبة للعمل مع JWT (مثل jjwt).
أضف التبعيات التالية إلى ملف pom.xml (Maven) أو build.gradle (Gradle):
<!-- Maven -->\n<dependency>\n <groupId>org.springframework.boot</groupId>\n <artifactId>spring-boot-starter-security</artifactId>\n</dependency>\n<dependency>\n <groupId>org.springframework.boot</groupId>\n <artifactId>spring-boot-starter-web</artifactId>\n</dependency>\n<dependency>\n <groupId>io.jsonwebtoken</groupId>\n <artifactId>jjwt-api</artifactId>\n <version>0.12.3</version>\n</dependency>\n<dependency>\n <groupId>io.jsonwebtoken</groupId>\n <artifactId>jjwt-impl</artifactId>\n <version>0.12.3</version>\n <scope>runtime</scope>\n</dependency>\n<dependency>\n <groupId>io.jsonwebtoken</groupId>\n <artifactId>jjwt-jackson</artifactId>\n <version>0.12.3</version>\n <scope>runtime</scope>\n</dependency>\nالآن سننشئ فئة تكوين أمان تقوم بتعطيل CSRF وتحديد سلسلة المرشحات.
\n\nتنفيذ خادم التفويض وإنشاء JWT
\nبالنسبة لـ OAuth 2.0، سنحتاج إلى نقطة نهاية (endpoint) تستقبل بيانات اعتماد العميل وتعيد رمز JWT المميز. في أبسط الحالات، يمكن أن يكون هذا محاكاة لخادم التفويض.
\nلننشئ خدمة للعمل مع JWT:
\nimport io.jsonwebtoken.Jwts;\nimport io.jsonwebtoken.SignatureAlgorithm;\nimport io.jsonwebtoken.security.Keys;\nimport org.springframework.stereotype.Service;\n\nimport javax.crypto.SecretKey;\nimport java.util.Date;\n\n@Service\npublic class JwtService {\n\n private final SecretKey secretKey = Keys.secretKeyFor(SignatureAlgorithm.HS256);\n private final long expirationMs = 3600000; // 1 ساعة\n\n public String generateToken(String username) {\n Date now = new Date();\n Date expiryDate = new Date(now.getTime() + expirationMs);\n\n return Jwts.builder()\n .subject(username)\n .issuedAt(now)\n .expiration(expiryDate)\n .signWith(secretKey)\n .compact();\n }\n\n public String