OAuth 2.0 وتفويض JWT في Java: دليل شامل

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

مقدمة في OAuth 2.0 وتفويض JWT على Java

تتطلب تطبيقات الويب الحديثة وواجهات برمجة التطبيقات (API) آليات موثوقة للمصادقة والتفويض. هناك معياران أصبحا واقعًا فعليًا في عالم تطوير Java وهما OAuth 2.0 وJWT (JSON Web Tokens). يوفر OAuth 2.0 بروتوكولًا لتفويض الوصول، بينما يوفر JWT تنسيقًا مضغوطًا ومكتفيًا ذاتيًا لنقل البيانات. في هذه المقالة، سنشرح كيفية دمج هذه التقنيات على Java باستخدام Spring Security والمكتبات الشائعة.

ستتعلم كيفية إعداد خادم التفويض، وإنشاء والتحقق من رموز JWT، وكذلك حماية نقاط النهاية REST الخاصة بك. ستكون المادة مفيدة لكل من المطورين المبتدئين وذوي الخبرة في Java الذين يرغبون في تعميق معرفتهم في مجال الأمان.



أساسيات OAuth 2.0: التدفقات والأدوار

يحدد OAuth 2.0 أربعة أدوار: Resource Owner (مالك المورد)، Client (التطبيق)، Authorization Server (خادم التفويض) وResource Server (خادم الموارد). تشمل التدفقات (grants) الأكثر شيوعًا:

  • Authorization Code — لتطبيقات الويب ذات الجزء الخادم.
  • Client Credentials — للاتصال بين الخادم والخادم.
  • Resource Owner Password — للعملاء الموثوقين (قيد الإهمال).
  • Implicit — لتطبيقات الصفحة الواحدة (SPA) (لم يعد موصى به).

على Java، يمكننا تنفيذ خادم OAuth 2.0 باستخدام spring-security-oauth2-authorization-server. لنلق نظرة على مثال لإعداد خادم تفويض أساسي.



إعداد Authorization Server على Spring Boot

أضف التبعيات في pom.xml:

<dependency>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-oauth2-authorization-server</artifactId></dependency><dependency>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-web</artifactId></dependency>

أنشئ التهيئة SecurityConfig.java:

@Configuration@EnableWebSecuritypublic class SecurityConfig {

@Bean @Order(1) public SecurityFilterChain authorizationServerSecurityFilterChain(HttpSecurity http) throws Exception { OAuth2AuthorizationServerConfiguration.applyDefaultSecurity(http); return http.build(); }

@Bean @Order(2) public SecurityFilterChain defaultSecurityFilterChain(HttpSecurity http) throws Exception { http.authorizeHttpRequests(authorize -> authorize .anyRequest().authenticated()) .formLogin(Customizer.withDefaults()); return http.build(); }

@Bean public RegisteredClientRepository registeredClientRepository() { RegisteredClient registeredClient = RegisteredClient.withId("client-id") .clientId("my-client") .clientSecret("{noop}secret") .authorizationGrantType(AuthorizationGrantType.AUTHORIZATION_CODE) .redirectUri("http://localhost:8080/login/oauth2/code/my-client") .scope("read") .scope("write") .build(); return new InMemoryRegisteredClientRepository(registeredClient); }}


JWT: هيكل وإنشاء الرموز

يتكون JWT من ثلاثة أجزاء: Header وPayload وSignature. يحتوي Header على نوع الرمز وخوارزمية التشفير. يتضمن Payload الادعاءات (claims) مثل sub (الموضوع) وexp (وقت الانتهاء) وroles. يضمن Signature سلامة البيانات.

للعمل مع JWT على Java، نستخدم المكتبة io.jsonwebtoken:jjwt. أضف التبعية

المدونات

توصيات الكتب