OAuth2 এবং JWT এর মাধ্যমে Secure Microservices তৈরি করা

Spring Cloud Security - স্প্রিং ক্লাউড (Spring Cloud) - Java Technologies

365

OAuth2 এবং JWT (JSON Web Tokens) ব্যবহার করে Secure Microservices তৈরি করা একটি আধুনিক ও নিরাপদ পদ্ধতি। এই পদ্ধতিটি মাইক্রোসার্ভিস আর্কিটেকচারে সুরক্ষিত অথেন্টিকেশন এবং অথরাইজেশন নিশ্চিত করতে সাহায্য করে।

OAuth2 এবং JWT-এর মাধ্যমে Secure Microservices তৈরি করার ধাপসমূহ

  1. OAuth2 কি? OAuth2 হল একটি অনুমোদন ফ্রেমওয়ার্ক যা অ্যাপ্লিকেশনগুলিকে ব্যবহারকারীর ডেটাতে অ্যাক্সেস দেওয়ার অনুমতি দেয়, তবে ব্যবহারকারীর পাসওয়ার্ড জানানো ছাড়া। এটি একটি এক্সটার্নাল অথোরাইজেশন সার্ভার ব্যবহার করে যে সার্ভিসটি অ্যাক্সেস করা হচ্ছে।
  2. JWT কি? JWT (JSON Web Token) একটি ওপেন স্ট্যান্ডার্ড (RFC 7519) যা নিরাপদভাবে তথ্য ট্রান্সফার করার জন্য ব্যবহৃত হয়। JWT মূলত একটি টোকেন যা ব্যবহারকারীর অথেন্টিকেশন ইনফরমেশন ধারণ করে এবং এটি স্বাক্ষরিত হয় যাতে ডেটা ভেরিফাই করা যায়।

ধাপ ১: Spring Security ও OAuth2 Configuration

1.1. ডিপেনডেন্সি যোগ করা

প্রথমে spring-boot-starter-oauth2-resource-server এবং spring-boot-starter-security ডিপেনডেন্সি যোগ করতে হবে।

<dependencies>
    <!-- OAuth2 Resource Server Starter -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-oauth2-resource-server</artifactId>
    </dependency>

    <!-- Spring Security Starter -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-security</artifactId>
    </dependency>

    <!-- JWT Decoder -->
    <dependency>
        <groupId>org.springframework.security</groupId>
        <artifactId>spring-security-oauth2-jose</artifactId>
    </dependency>
</dependencies>

1.2. application.properties কনফিগারেশন

OAuth2 অথেন্টিকেশন এবং JWT এর জন্য application.properties অথবা application.yml কনফিগারেশন ফাইলের মাধ্যমে কনফিগার করতে হবে।

# OAuth2 Configuration
spring.security.oauth2.resourceserver.jwt.issuer-uri=https://your-auth-server.com/issuer
spring.security.oauth2.resourceserver.jwt.jwk-set-uri=https://your-auth-server.com/.well-known/jwks.json

# Optional: Customize JWT validation settings
spring.security.oauth2.resourceserver.jwt.audiences=your-audience
  • issuer-uri: এটি OAuth2 সার্ভারের ইউআরএল, যেখানে JWT টোকেন তৈরি হয়।
  • jwk-set-uri: এটি JWT টোকেনের পে-লোড ভ্যালিডেট করতে ব্যবহৃত JWK (JSON Web Key) সেটের ইউআরএল।

ধাপ ২: JWT Decoder কনফিগারেশন

JWT Decoder সেটআপ করে JWT টোকেন ভ্যালিডেশন করা হয়।

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.oauth2.jwt.JwtDecoder;
import org.springframework.security.oauth2.jwt.NimbusJwtDecoder;

@Configuration
public class SecurityConfig {

    @Bean
    public JwtDecoder jwtDecoder() {
        return NimbusJwtDecoder.withJwkSetUri("https://your-auth-server.com/.well-known/jwks.json").build();
    }
}

এই কনফিগারেশন JWT টোকেনের সঠিকতা যাচাই করার জন্য NimbusJwtDecoder ব্যবহার করে।


ধাপ ৩: API গেটওয়ে ও Feign Client ব্যবহার করে Secure Microservices

3.1. API গেটওয়ে কনফিগারেশন

আপনি যদি Spring Cloud Gateway বা Zuul API গেটওয়ে ব্যবহার করেন, তবে গেটওয়ে কনফিগারেশনও OAuth2 এবং JWT টোকেন যাচাই করতে হবে।

Spring Cloud Gateway কনফিগারেশন:
# Spring Cloud Gateway OAuth2 Configuration
spring.security.oauth2.client.registration.my-client.client-id=your-client-id
spring.security.oauth2.client.registration.my-client.client-secret=your-client-secret
spring.security.oauth2.client.registration.my-client.scope=read,write
spring.security.oauth2.client.provider.my-client.token-uri=https://your-auth-server.com/oauth/token

3.2. Feign Client Authentication

Feign ক্লায়েন্টে OAuth2 টোকেন ব্যবহার করার জন্য, আপনাকে HTTP হেডারে টোকেন যোগ করতে হবে।

@FeignClient(name = "user-service", configuration = OAuth2FeignConfig.class)
public interface UserServiceClient {

    @GetMapping("/users/{id}")
    User getUserById(@PathVariable("id") Long id);
}
@Configuration
public class OAuth2FeignConfig {

    @Bean
    public RequestInterceptor oauth2RequestInterceptor() {
        return new OAuth2RequestInterceptor();
    }
}

ধাপ ৪: Resource Server কনফিগারেশন

অথবা আপনি একটি Resource Server তৈরি করতে পারেন যা JWT টোকেন ভ্যালিডেশন করবে এবং সেটি Spring Security দিয়ে সুরক্ষিত হবে।

import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;

@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
            .antMatchers("/public/**").permitAll() // Public endpoints
            .anyRequest().authenticated() // Secure all other endpoints
            .and()
            .oauth2ResourceServer().jwt(); // Enable JWT authentication
    }
}

এখানে, `/public/** এন্ডপয়েন্টটি পাবলিক এবং বাকি সব রিকোয়েস্ট সুরক্ষিত (authenticated) করা হয়েছে।


ধাপ ৫: OAuth2 Authorization Server তৈরি করা

যদি আপনি একটি কাস্টম Authorization Server চান, তবে আপনাকে Spring Security OAuth2 Authorization Server কনফিগারেশন করতে হবে।

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.oauth2.authorization.server.config.annotation.web.configuration.AuthorizationServerConfigurerAdapter;
import org.springframework.security.oauth2.authorization.server.config.annotation.web.configuration.EnableAuthorizationServer;
import org.springframework.security.oauth2.core.AuthorizationGrantType;
import org.springframework.security.oauth2.core.ClientAuthenticationMethod;

@Configuration
@EnableAuthorizationServer
public class AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter {

    @Override
    public void configure(HttpSecurity http) throws Exception {
        http
            .formLogin()
            .and()
            .authorizeRequests()
            .anyRequest().authenticated();
    }

    @Bean
    public ClientDetailsServiceConfigurer clientDetailsServiceConfigurer() {
        return new ClientDetailsServiceConfigurer()
            .withClient("your-client-id")
            .secret("your-client-secret")
            .authorizedGrantTypes(AuthorizationGrantType.CLIENT_CREDENTIALS)
            .scopes("read", "write");
    }
}

ধাপ ৬: Secure Microservices Example

6.1. Authentication Controller (For getting JWT Token)

@RestController
@RequestMapping("/auth")
public class AuthController {

    private final AuthenticationManager authenticationManager;

    public AuthController(AuthenticationManager authenticationManager) {
        this.authenticationManager = authenticationManager;
    }

    @PostMapping("/token")
    public String getToken(@RequestBody AuthenticationRequest authRequest) {
        Authentication authentication = authenticationManager.authenticate(
                new UsernamePasswordAuthenticationToken(authRequest.getUsername(), authRequest.getPassword()));
        return jwtTokenProvider.generateToken(authentication);
    }
}

6.2. Secure API Controller

@RestController
@RequestMapping("/api")
public class SecureController {

    @GetMapping("/users")
    public String getUsers() {
        return "List of users from secure service";
    }
}

এখানে /auth/token এ রিকোয়েস্ট পাঠিয়ে JWT টোকেন পাওয়া যাবে এবং সেই টোকেন দিয়ে /api/users এর মতো সুরক্ষিত এন্ডপয়েন্ট অ্যাক্সেস করা যাবে।


উপসংহার:

  1. OAuth2 এবং JWT এর মাধ্যমে আপনার মাইক্রোসার্ভিসগুলি সুরক্ষিত করতে পারবেন।
  2. Spring Security ব্যবহার করে OAuth2 এবং JWT টোকেনের সাহায্যে অথেন্টিকেশন এবং অথরাইজেশন কনফিগার করা যায়।
  3. Feign Client এবং Spring Cloud Gateway-এ OAuth2 এবং JWT সমর্থন রয়েছে, যা মাইক্রোসার্ভিসগুলির মধ্যে নিরাপদ যোগাযোগ নিশ্চিত করে।
  4. Resource Server কনফিগার করে JWT ভ্যালিডেশন চালু করা যায়।

এই পদ্ধতিটি মাইক্রোসার্ভিস আর্কিটেকচারের নিরাপত্তা নিশ্চিত করতে অত্যন্ত গুরুত্বপূর্ণ, যেখানে বিভিন্ন সার্ভিস একে অপরের সাথে নিরাপদভাবে যোগাযোগ করতে পারে।

Content added By
Promotion

Are you sure to start over?

Loading...