مقدمة في OAuth 2.0 و JWT بلغة Kotlin
\n\nتتطلب تطبيقات الويب وواجهات برمجة التطبيقات الحديثة آليات موثوقة للمصادقة والتفويض. هناك معياران رئيسيان — OAuth 2.0 (بروتوكول تفويض الوصول) و JWT (رمز الويب JSON، وهو تنسيق مضغوط للرمز المميز) — غالبًا ما يُستخدمان معًا لبناء أنظمة آمنة. Kotlin، بفضل توافقها مع Java وبناء جملتها المختصرة، مناسبة تمامًا لتنفيذ هذه البروتوكولات.
\n\nفي هذه المقالة، سنشرح كيفية تنفيذ OAuth 2.0 وتفويض JWT بلغة Kotlin عمليًا. ستتعلم كيفية إعداد خادم إصدار الرموز المميزة، وإنشاء نقاط نهاية محمية، ومعالجة أنواع المنح المختلفة (grant types)، مثل رمز التفويض (Authorization Code) وبيانات اعتماد العميل (Client Credentials).
\n\nالأساسيات: OAuth 2.0 و JWT
\n\nما هو OAuth 2.0؟
\nOAuth 2.0 هو بروتوكول يسمح للتطبيقات الخارجية بالحصول على وصول محدود إلى موارد المستخدم دون نقل اسم المستخدم وكلمة المرور. المشاركون الرئيسيون:
\n- \n
- مالك المورد (Resource Owner) — عادةً المستخدم. \n
- العميل (Client) — التطبيق الذي يطلب الوصول. \n
- خادم التفويض (Authorization Server) — يصدر الرموز المميزة.
- خادم الموارد (Resource Server) — يخزن البيانات المحمية.
ما هو JWT؟
\nJWT هو رمز مميز مضغوط وآمن لعناوين URL، ويتكون من ثلاثة أجزاء (الرأس، الحمولة، التوقيع) مفصولة بنقاط. يُستخدم لنقل الادعاءات (claims) بين الأطراف. مزايا JWT:
\n- \n
- لا يتطلب تخزين جلسة على الخادم (عديم الحالة - stateless). \n
- يحتوي على جميع المعلومات الضرورية (مثل معرف المستخدم، الأدوار). \n
- موقع بتوقيع رقمي، مما يضمن سلامته.
تنفيذ OAuth 2.0 مع JWT بلغة Kotlin (Spring Boot)
\n\nلننظر إلى مثال عملي باستخدام Spring Boot ومكتبة Spring Security. سنقوم بإنشاء خادم تفويض بسيط ومورد محمي.
\n\nالخطوة 1: إعداد التبعيات
\nأضف التبعيات اللازمة إلى ملف build.gradle.kts:
dependencies {\n implementation("org.springframework.boot:spring-boot-starter-web")\n implementation("org.springframework.boot:spring-boot-starter-security")\n implementation("org.springframework.security:spring-security-oauth2-authorization-server")\n implementation("io.jsonwebtoken:jjwt-api:0.12.3")\n runtimeOnly("io.jsonwebtoken:jjwt-impl:0.12.3")\n runtimeOnly("io.jsonwebtoken:jjwt-jackson:0.12.3")\n}\n\nالخطوة 2: تكوين خادم التفويض
\nأنشئ فئة تكوين لـ OAuth 2.0:
\nimport org.springframework.context.annotation.Bean\nimport org.springframework.context.annotation.Configuration\nimport org.springframework.security.config.annotation.web.builders.HttpSecurity\nimport org.springframework.security.config.annotation.web.configuration.EnableWebSecurity\nimport org.springframework.security.core.userdetails.User\nimport org.springframework.security.core.userdetails.UserDetailsService\nimport org.springframework.security.oauth2.core.AuthorizationGrantType\nimport org.springframework.security.oauth2.core.ClientAuthenticationMethod\nimport org.springframework.security.oauth2.server.authorization.client.InMemoryRegisteredClientRepository\nimport org.springframework.security.oauth2.server.authorization.client.RegisteredClient\nimport org.springframework.security.oauth2.server.authorization.client.RegisteredClientRepository\nimport org.springframework.security.oauth2.server.authorization.config.annotation.web.configuration.OAuth2AuthorizationServerConfiguration\nimport org.springframework.security.provisioning.InMemoryUserDetailsManager\nimport org.springframework.security.web.SecurityFilterChain\nimport java.util.UUID\n\n@Configuration\n@EnableWebSecurity\nclass SecurityConfig {\n\n @Bean\n