مقدمة في OAuth 2.0 و JWT في Java
\n\nنادرًا ما تخلو تطبيقات الويب وواجهات API الحديثة من آليات المصادقة والتفويض. المعياران الأكثر شيوعًا في هذا المجال هما OAuth 2.0 و JWT (JSON Web Token). إذا كنت مطور Java مبتدئًا، فإن فهم هذه التقنيات سيفتح لك الطريق لبناء أنظمة آمنة وقابلة للتوسع.
\n\nOAuth 2.0 هو بروتوكول تفويض يسمح للتطبيقات بالحصول على وصول محدود إلى موارد المستخدم دون نقل بيانات اعتماده. أما JWT، فهو تنسيق رمز مميز مضغوط يُستخدم لنقل الادعاءات (claims) بين الأطراف. في هذه المقالة، سنشرح كيفية دمج هذه التقنيات في تطبيق Java باستخدام Spring Security والمكتبات الشائعة.
\n\nأساسيات OAuth 2.0: كيف يعمل
\n\nيحدد OAuth 2.0 عدة أدوار للمشاركين في التفاعل:
\n\n- \n
- مالك المورد (Resource Owner) — المستخدم الذي يمتلك البيانات المحمية \n
- العميل (Client) — التطبيق الذي يطلب الوصول \n
- خادم التفويض (Authorization Server) — الخادم الذي يصدر الرموز المميزة بعد المصادقة \n
- خادم المورد (Resource Server) — الخادم الذي يخزن الموارد المحمية \n
الفكرة الأساسية للبروتوكول هي أن العميل يحصل على رمز وصول مؤقت يقدمه لخادم المورد. السيناريو الأكثر شيوعًا هو تدفق رمز التفويض (Authorization Code Flow)، والذي يُستخدم في تطبيقات الويب.
\n\nمثال على إعداد عميل OAuth 2.0 في Spring Boot
\n\nأضف التبعية في pom.xml:
<dependency>\n <groupId>org.springframework.boot</groupId>\n <artifactId>spring-boot-starter-oauth2-client</artifactId>\n</dependency>\n\nقم بتكوين application.yml للعمل مع Google OAuth 2.0:
spring:\n security:\n oauth2:\n client:\n registration:\n google:\n client-id: YOUR_CLIENT_ID\n client-secret: YOUR_CLIENT_SECRET\n scope:\n - email\n - profile\n\nالآن سيقوم Spring Security تلقائيًا بمعالجة إعادة التوجيه إلى صفحة تسجيل الدخول من Google وإرجاع رمز الوصول.
\n\nJWT: هيكل وإنشاء الرمز المميز
\n\nيتكون JWT من ثلاثة أجزاء مفصولة بنقاط:
\n\n- \n
- الرأس (Header) — يحتوي على نوع الرمز المميز وخوارزمية التوقيع (مثل HS256) \n
- الحمولة (Payload) — تحتوي على الادعاءات (claims): بيانات المستخدم، تاريخ انتهاء الصلاحية، الدور \n
- التوقيع (Signature) — توقيع تم إنشاؤه من الرأس والحمولة باستخدام مفتاح سري \n
للعمل مع JWT في Java، غالبًا ما تُستخدم مكتبة jjwt. أضف التبعية:
\n\n<dependency>\n <groupId>io.jsonwebtoken</groupId>\n <artifactId>jjwt-api</artifactId>\n <version>0.12.5</version>\n</dependency>\n<dependency>\n <groupId>io.jsonwebtoken</groupId>\n <artifactId>jjwt-impl</artifactId>\n <version>0.12.5</version>\n <scope>runtime</scope>\n</dependency>\n<dependency>\n <groupId>io.jsonwebtoken</groupId>\n <artifactId>jjwt-jackson</artifactId>\n <version>0.12.5</version>\n <scope>runtime</scope>\n</dependency>\n\nإنشاء رمز JWT مميز في Java
\n\nإليك مثال على فئة لتوليد والتحقق من صحة JWT:
\n\nimport io.jsonwebtoken.*;\nimport io.jsonwebtoken.security.Keys;\nimport javax.crypto.SecretKey;\nimport java.util.Date;\n\npublic class JwtUtil {\n\n private final SecretKey secretKey = Keys.hmacShaKeyFor(\n "my-secret-key-which-should-be-at-least-256-bits-long".getBytes()\n );\n\n public St