مقدمة في OAuth 2.0 و JWT بلغة Java
تتطلب تطبيقات الويب الحديثة وواجهات API آليات موثوقة للمصادقة والتفويض. المعياران الأكثر شيوعًا في هذا المجال هما OAuth 2.0 و JWT (JSON Web Tokens). إذا كنت مطور Java مبتدئًا، فإن فهم هذه التقنيات سيفتح لك الطريق لإنشاء تطبيقات آمنة وقابلة للتوسع.
في هذه المقالة، سنشرح ما هما OAuth 2.0 و JWT، وكيف يعملان معًا، وكيفية تنفيذهما بلغة Java باستخدام المكتبات الشائعة. ستتعلم كيفية إعداد خادم التفويض، وإنشاء رموز JWT والتحقق منها، بالإضافة إلى حماية واجهات REST API الخاصة بك.
ما هما OAuth 2.0 و JWT؟
OAuth 2.0 — بروتوكول الوصول المفوض
OAuth 2.0 هو بروتوكول تفويض يسمح للتطبيقات بالحصول على وصول محدود إلى موارد المستخدم دون نقل بيانات اعتماده. تخيل أنك تريد منح تطبيق ما حق الوصول إلى صورك في Google. بدلاً من إعطاء التطبيق كلمة مرور Google الخاصة بك، تستخدم OAuth 2.0 الذي يصدر للتطبيق رمزًا مميزًا مؤقتًا بصلاحيات محدودة.
المشاركون الرئيسيون في OAuth 2.0:
- مالك المورد (Resource Owner) — المستخدم الذي يملك الموارد
- العميل (Client) — التطبيق الذي يطلب الوصول
- خادم التفويض (Authorization Server) — الخادم الذي يصدر الرموز المميزة
- خادم المورد (Resource Server) — الخادم الذي يوفر الموارد المحمية
JWT — تنسيق رمز مميز مضغوط
JWT (JSON Web Token) هو معيار مفتوح (RFC 7519) لإنشاء رموز وصول تحتوي على ادعاءات (claims) بتنسيق JSON. يتكون JWT من ثلاثة أجزاء مفصولة بنقاط:
- الرأس (Header) — يحتوي على نوع الرمز المميز وخوارزمية التوقيع (مثل HS256 أو RS256)
- الحمولة (Payload) — تحتوي على الادعاءات (مثل معرف المستخدم، الأدوار، تاريخ انتهاء الصلاحية)
- التوقيع (Signature) — توقيع يضمن سلامة الرمز المميز
مثال على JWT: eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxMjM0NTY3ODkwIn0.dozjgNryP4J3jVmNHl0w5N_XgL0n3I9PlFUP0THsR8U
تنفيذ OAuth 2.0 و JWT بلغة Java
إعداد المشروع باستخدام Spring Security
لتنفيذ OAuth 2.0 و JWT بلغة Java، سنستخدم Spring Boot و Spring Security. لنبدأ بإضافة التبعيات إلى ملف pom.xml:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId></dependency><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId></dependency><dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt-api</artifactId> <version>0.12.3</version></dependency><dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt-impl</artifactId> <version>0.12.3</version> <scope>runtime</scope></dependency><dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt-jackson</artifactId> <version>0.12.3</version> <scope>runtime</scope></dependency>إنشاء مزود JWT
لننشئ فئة JwtProvider التي ستكون مسؤولة عن إنشاء رموز JWT والتحقق من صحتها:
import io.jsonwebtoken.*;import io.jsonwebtoken.security.Keys;import org.springframework.stereotype.Component;
import javax.crypto.SecretKey;import java.util.Date;
@Componentpublic class JwtProvider { private final SecretKey secretKey = Keys.secretKeyFor(SignatureAlgorithm.HS256); private final