Logo Logo
  • Academy
  • Admission
  • Job Assistant
  • Skill
  • Course
  • Book
  • Exams
  • Pricing
  • Others
    • Career
    • Forum
    • Blog
    • Dynamic Print
    • Hand Note
    • Study Plan
    • Quran
    • Notices
    • Upload Your Question
    • Current Affairs
    • Create Business Account
light mode
night mode
Sign In
Logo Logo
Skill
  • Home
  • Skill
  • স্প্রিং সিকিউরি...
  • Spring Security...
Back
স্প্রিং সিকিউরিটি (Spring Security)
Spring Security এর পরিচিতি Spring Security কি এবং কেন এটি প্রয়োজন? Authentication এবং Authorization এর ধারণা Spring Framework এ Spring Security এর ভূমিকা Spring Boot এবং Spring Security Integration Spring Security Setup এবং কনফিগারেশন Spring Initializr দিয়ে Spring Security প্রজেক্ট তৈরি করা Maven/Gradle দিয়ে Spring Security অন্তর্ভুক্ত করা application.properties বা application.yml ফাইলে Security কনফিগারেশন প্রথম Spring Security প্রজেক্ট তৈরি (Hello Secure World) Spring Security এর Authentication এবং Authorization Authentication কি এবং এর ভূমিকা Authorization কি এবং এর প্রকারভেদ UserDetailsService ইন্টারফেস এবং Custom UserDetails তৈরি উদাহরণ সহ Authentication এবং Authorization বাস্তবায়ন Spring Security এর Basic Authentication Basic Authentication কি এবং এর প্রয়োজনীয়তা Spring Security দিয়ে Basic Authentication কনফিগার করা HttpSecurity এবং WebSecurityConfigurerAdapter ব্যবহার উদাহরণ সহ Basic Authentication Spring Security এর Form-Based Authentication Form-Based Authentication কি এবং এর প্রয়োগ Custom Login এবং Logout পেজ কনফিগার করা Spring Security এর Remember-Me ফিচার উদাহরণ সহ Form-Based Authentication Spring Security এবং CSRF Protection CSRF (Cross-Site Request Forgery) কি এবং কেন এটি প্রয়োজন? Spring Security তে CSRF Protection কনফিগার করা Custom CSRF Token এবং Exception Handling উদাহরণ সহ CSRF Protection বাস্তবায়ন Spring Security এবং Password Management BCryptPasswordEncoder দিয়ে পাসওয়ার্ড এনকোড করা Spring Security তে পাসওয়ার্ড রিসেট এবং পরিবর্তন উদাহরণ সহ Password Encoding এবং Management Role-Based এবং Permission-Based Authorization Role-Based Authorization কি এবং এর প্রয়োগ @PreAuthorize এবং @Secured এর মাধ্যমে Authorization কনফিগার করা উদাহরণ সহ Role-Based এবং Permission-Based Authorization Spring Security এবং JWT (JSON Web Token) JWT কি এবং কেন এটি ব্যবহার করা হয়? Spring Security তে JWT Authentication কনফিগার করা Token Generation, Validation এবং Expiration Management উদাহরণ সহ JWT Authentication এবং Authorization OAuth2 এবং Spring Security Integration OAuth2 কি এবং এর কাজের প্রক্রিয়া Spring Security তে OAuth2 Authentication কনফিগার করা OAuth2 এর মাধ্যমে Third-Party Login Integration উদাহরণ সহ OAuth2 Integration Spring Security এবং Social Login Integration Social Login কি এবং কেন এটি প্রয়োজন? Google, Facebook, এবং GitHub Login এর সাথে Integration উদাহরণ সহ Spring Security তে Social Login কনফিগার করা Spring Security এবং JWT Refresh Token Implementation Refresh Token কি এবং এর প্রয়োজনীয়তা Spring Security তে JWT Refresh Token কনফিগার করা Token Expiration Management এবং Refresh Token Generation উদাহরণ সহ Refresh Token বাস্তবায়ন Method-Level Security Method-Level Security কি এবং এর প্রয়োগ @PreAuthorize, @PostAuthorize, এবং @Secured Annotation এর ব্যবহার উদাহরণ সহ Method-Level Security কনফিগারেশন Spring Security এবং Session Management Session Management কি এবং এর প্রয়োজনীয়তা Spring Security তে Session Fixation Protection কনফিগার করা Concurrent Session Control এবং Session Timeout Management উদাহরণ সহ Session Management Spring Security এবং CORS (Cross-Origin Resource Sharing) CORS কি এবং কেন এটি গুরুত্বপূর্ণ? Spring Security তে CORS কনফিগার করা CORS Policy এবং Custom CORS Filter তৈরি উদাহরণ সহ CORS Management Spring Security এবং Remember-Me Authentication Remember-Me Authentication কি এবং এর প্রয়োগ Token-Based Remember-Me Authentication কনফিগার করা উদাহরণ সহ Remember-Me Authentication Spring Security এবং Two-Factor Authentication (2FA) Two-Factor Authentication কি এবং কেন এটি প্রয়োজন? Spring Security তে Google Authenticator ব্যবহার করে 2FA কনফিগার করা উদাহরণ সহ 2FA বাস্তবায়ন Spring Security এর জন্য Custom Filters Spring Security তে Custom Filter তৈরি করা OncePerRequestFilter এবং GenericFilterBean ব্যবহার Custom Authentication এবং Authorization Filter কনফিগার করা উদাহরণ সহ Custom Filter বাস্তবায়ন Spring Security এর Exception Handling Spring Security তে Exception Handling এর প্রয়োজনীয়তা Custom AuthenticationFailureHandler এবং AccessDeniedHandler ব্যবহার উদাহরণ সহ Custom Exception Handling Spring Security এর জন্য Testing এবং Debugging Spring Security তে Unit এবং Integration Testing @WithMockUser এবং @WithUserDetails এর মাধ্যমে টেস্টিং উদাহরণ সহ Spring Security এর Testing এবং Debugging Spring Security এবং Security Headers Security Headers কি এবং কেন এটি গুরুত্বপূর্ণ? Spring Security তে XSS এবং Clickjacking Protection কনফিগার করা HSTS (HTTP Strict Transport Security) এবং Content Security Policy (CSP) কনফিগারেশন উদাহরণ সহ Security Headers বাস্তবায়ন Spring Security এবং API Security REST API এর জন্য Security কনফিগার করা Token-Based Authentication এবং Stateless Session কনফিগারেশন উদাহরণ সহ REST API এর জন্য Spring Security বাস্তবায়ন Spring Security এবং Monitoring Integration Spring Security তে Monitoring এর প্রয়োজনীয়তা Spring Boot Actuator এবং Micrometer ব্যবহার করে Security Monitoring উদাহরণ সহ Security Monitoring বাস্তবায়ন Spring Security এর জন্য Best Practices Spring Security প্রোজেক্টের জন্য Best Practices Password Management, JWT, এবং OAuth2 এর জন্য Security Best Practices উদাহরণ সহ Best Practices

Spring Security এবং JWT Refresh Token Implementation

Java Technologies - স্প্রিং সিকিউরিটি (Spring Security)
166
166

JWT (JSON Web Token) এবং Refresh Token ইমপ্লিমেন্টেশন ব্যবহার করে আপনি স্প্রিং সিকিউরিটিতে টোকেন ভিত্তিক অথেনটিকেশন এবং অথরাইজেশন প্রক্রিয়া সেটআপ করতে পারেন। JWT টোকেন সাধারণত সেশনবিহীন অথেনটিকেশন সরবরাহ করে, যা একটি শক্তিশালী নিরাপত্তা বৈশিষ্ট্য হিসেবে কাজ করে। Refresh Token ব্যবহার করলে, ব্যবহারকারী লগ ইন থাকার সময় তার অ্যাক্সেস টোকেনটি পুনর্নবীকরণ করতে পারে, এবং এটি সময়সীমার মধ্যে নতুন অ্যাক্সেস টোকেন পেতে সহায়ক।

এখানে Spring Security এবং JWT Refresh Token ইমপ্লিমেন্টেশন একটি উদাহরণের মাধ্যমে ব্যাখ্যা করা হয়েছে।


১. প্রয়োজনীয় ডিপেন্ডেন্সি (Maven)

pom.xml ফাইলে নিম্নলিখিত ডিপেন্ডেন্সি যোগ করুন:

<dependencies>
    <!-- Spring Boot Web Starter -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

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

    <!-- Spring Boot Starter OAuth2 Client -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-oauth2-client</artifactId>
    </dependency>

    <!-- JWT Library -->
    <dependency>
        <groupId>io.jsonwebtoken</groupId>
        <artifactId>jjwt</artifactId>
        <version>0.11.5</version>
    </dependency>

    <!-- Spring Boot Starter Data JPA (for user management if needed) -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
</dependencies>

২. JWT Token Utility ক্লাস তৈরি করা

JWT টোকেন তৈরি এবং যাচাই করার জন্য একটি JwtTokenUtil ক্লাস তৈরি করুন:

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import org.springframework.stereotype.Component;

import java.util.Date;

@Component
public class JwtTokenUtil {

    private String secretKey = "yourSecretKey"; // Secret key for signing JWT

    private long accessTokenValidity = 1000 * 60 * 60; // 1 hour for access token
    private long refreshTokenValidity = 1000 * 60 * 60 * 24 * 7; // 1 week for refresh token

    // Create Access Token
    public String generateAccessToken(String username) {
        return Jwts.builder()
                .setSubject(username)
                .setIssuedAt(new Date())
                .setExpiration(new Date(System.currentTimeMillis() + accessTokenValidity))
                .signWith(SignatureAlgorithm.HS512, secretKey)
                .compact();
    }

    // Create Refresh Token
    public String generateRefreshToken(String username) {
        return Jwts.builder()
                .setSubject(username)
                .setIssuedAt(new Date())
                .setExpiration(new Date(System.currentTimeMillis() + refreshTokenValidity))
                .signWith(SignatureAlgorithm.HS512, secretKey)
                .compact();
    }

    // Parse Claims
    public Claims getClaims(String token) {
        return Jwts.parser()
                .setSigningKey(secretKey)
                .parseClaimsJws(token)
                .getBody();
    }

    // Validate Token
    public boolean isTokenExpired(String token) {
        return getClaims(token).getExpiration().before(new Date());
    }

    // Get Username from Token
    public String getUsernameFromToken(String token) {
        return getClaims(token).getSubject();
    }

    // Validate Access Token
    public boolean validateAccessToken(String token, String username) {
        return (username.equals(getUsernameFromToken(token)) && !isTokenExpired(token));
    }
}

৩. Spring Security কনফিগারেশন

স্প্রিং সিকিউরিটিতে JWT অথেনটিকেশন এবং রিফ্রেশ টোকেন ব্যবহারের জন্য SecurityConfig কনফিগারেশন ক্লাস তৈরি করুন।

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.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    private final JwtTokenUtil jwtTokenUtil;

    public SecurityConfig(JwtTokenUtil jwtTokenUtil) {
        this.jwtTokenUtil = jwtTokenUtil;
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.csrf().disable()
            .authorizeRequests()
            .antMatchers("/auth/**").permitAll() // Allow public access to auth routes
            .anyRequest().authenticated() // Require authentication for other routes
            .and()
            .addFilter(new JwtAuthenticationFilter(authenticationManager(), jwtTokenUtil));
    }
}

৪. JWT Authentication Filter

JWT টোকেন যাচাই এবং অনুমোদন পরিচালনা করার জন্য একটি ফিল্টার তৈরি করুন।

import io.jsonwebtoken.ExpiredJwtException;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.web.authentication.WebAuthenticationDetailsSource;
import org.springframework.web.filter.OncePerRequestFilter;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;

public class JwtAuthenticationFilter extends OncePerRequestFilter {

    private final JwtTokenUtil jwtTokenUtil;

    public JwtAuthenticationFilter(JwtTokenUtil jwtTokenUtil) {
        this.jwtTokenUtil = jwtTokenUtil;
    }

    @Override
    protected void doFilterInternal(HttpServletRequest request, javax.servlet.FilterChain chain) throws ServletException, IOException {
        String token = getJwtFromRequest(request);
        if (token != null && jwtTokenUtil.validateAccessToken(token, getUsernameFromToken(token))) {
            // Set authentication context
            SecurityContextHolder.getContext().setAuthentication(new JwtAuthenticationToken(getUsernameFromToken(token)));
        }
        chain.doFilter(request, response);
    }

    // Extract JWT from the request header
    private String getJwtFromRequest(HttpServletRequest request) {
        String bearerToken = request.getHeader("Authorization");
        if (bearerToken != null && bearerToken.startsWith("Bearer ")) {
            return bearerToken.substring(7);
        }
        return null;
    }

    // Get Username from Token
    private String getUsernameFromToken(String token) {
        return jwtTokenUtil.getUsernameFromToken(token);
    }
}

৫. Authentication Controller

এখন আপনি AuthenticationController তৈরি করতে পারেন যা Login, Generate Access Token, এবং Refresh Token প্রদান করবে।

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

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

    private final JwtTokenUtil jwtTokenUtil;

    @Autowired
    public AuthenticationController(JwtTokenUtil jwtTokenUtil) {
        this.jwtTokenUtil = jwtTokenUtil;
    }

    // Generate Access Token and Refresh Token
    @PostMapping("/login")
    public JwtResponse login(@RequestBody LoginRequest loginRequest) {
        // Normally you'd authenticate the user here
        String username = loginRequest.getUsername(); // Assume user is authenticated

        String accessToken = jwtTokenUtil.generateAccessToken(username);
        String refreshToken = jwtTokenUtil.generateRefreshToken(username);

        return new JwtResponse(accessToken, refreshToken);
    }

    // Refresh Token
    @PostMapping("/refresh")
    public JwtResponse refresh(@RequestBody RefreshRequest refreshRequest) {
        String refreshToken = refreshRequest.getRefreshToken();
        String username = jwtTokenUtil.getUsernameFromToken(refreshToken);

        // Optionally validate refresh token here

        String newAccessToken = jwtTokenUtil.generateAccessToken(username);
        return new JwtResponse(newAccessToken, refreshToken);
    }
}

৬. Request and Response DTOs

LoginRequest DTO:

public class LoginRequest {
    private String username;
    private String password;

    // Getters and Setters
}

RefreshRequest DTO:

public class RefreshRequest {
    private String refreshToken;

    // Getter and Setter
}

JwtResponse DTO:

public class JwtResponse {
    private String accessToken;
    private String refreshToken;

    public JwtResponse(String accessToken, String refreshToken) {
        this.accessToken = accessToken;
        this.refreshToken = refreshToken;
    }

    // Getters and Setters
}

৭. Conclusion

এই উদাহরণটি Spring Security এবং JWT Refresh Token ইমপ্লিমেন্টেশন কভার করে, যা Access Token এবং Refresh Token প্রক্রিয়া পরিচালনা করে। ব্যবহারকারী লগইন করলে একটি Access Token এবং একটি Refresh Token প্রদান করা হয়, এবং যখন Access Token এর মেয়াদ শেষ হয়ে যায়, তখন Refresh Token এর মাধ্যমে নতুন Access Token পাওয়া যায়।

এটি stateless authentication এ সহায়ক এবং অ্যাপ্লিকেশনগুলিতে নিরাপত্তা প্রদান করে।

Content added By
Md Zahid Hasan

Refresh Token কি এবং এর প্রয়োজনীয়তা

73
73

Refresh Token একটি নিরাপদ টোকেন যা Access Token পুনঃপ্রাপ্ত করার জন্য ব্যবহৃত হয়। সাধারণত, Access Token (যা JWT-এ থাকে) একটি নির্দিষ্ট সময় (যেমন, ১ ঘণ্টা) পর্যন্ত বৈধ থাকে এবং পরবর্তী সময়ে এটি expire হয়ে যায়। কিন্তু ব্যবহারকারীকে বারবার লগইন করার পরিবর্তে Refresh Token ব্যবহার করে নতুন Access Token জেনারেট করা যায়।

একটি Refresh Token দীর্ঘ সময়ের জন্য বৈধ থাকে, তবে Access Token-এর মতো এটি সাধারণত ক্লায়েন্ট-সার্ভারে স্টোর করা হয় না। Refresh Token শুধুমাত্র সেই সময়ে ব্যবহার করা হয় যখন Access Token মেয়াদ উত্তীর্ণ হয়ে যায়।


Refresh Token-এর প্রয়োজনীয়তা

  1. Access Token Expiration: Access Token সাধারণত একটি ছোট সময় (যেমন ১ ঘণ্টা) বৈধ থাকে। যদি কোনও ব্যবহারকারী দীর্ঘ সময় ধরে অ্যাপ্লিকেশন ব্যবহার করতে চান, তবে তারা প্রতি Access Token-এর মেয়াদ শেষে পুনরায় লগইন করতে বাধ্য হবে, যা ব্যবহারকারীর জন্য অসুবিধাজনক হতে পারে। Refresh Token-এর মাধ্যমে, ব্যবহারকারী তাদের Access Token পুনরুদ্ধার করতে পারে, যেটি নতুন Access Token তৈরি করতে ব্যবহৃত হয়।
  2. Security:
    • Access Token সাধারণত কম সময়ের জন্য বৈধ থাকে (যেমন ১ ঘণ্টা)। এটি সংক্ষিপ্ত সময়ের জন্য ব্যবহৃত হয়, তাই যদি এটি চুরি হয়, আক্রমণকারী দ্রুত এক্সপায়ার হয়ে যাবে।
    • Refresh Token সাধারণত দীর্ঘ সময়ের জন্য বৈধ থাকে (যেমন কয়েক দিন বা সপ্তাহ)। এটি সিস্টেমের ভিতরে নিরাপদে সংরক্ষিত থাকে এবং শুধুমাত্র Access Token পুনরুদ্ধার করতে ব্যবহৃত হয়। এক্ষেত্রে এটি বিশেষভাবে নিরাপদ, কারণ এটি ব্যবহারকারীকে পুনরায় লগইন করতে বাধ্য না করে।
  3. Stateless Authentication: Refresh Token JWT-এর মতো stateless অথেনটিকেশন মেথডের জন্য গুরুত্বপূর্ণ। সাধারণত JWT ব্যবহার করে আপনি কোনও সেশন ম্যানেজমেন্ট ছাড়াই Authentication পরিচালনা করতে পারেন, তবে JWT-এর অ্যাক্সেস টোকেনের মেয়াদ শেষ হয়ে গেলে ব্যবহারকারীকে আবার লগইন করতে হয়। Refresh Token এর মাধ্যমে, আপনি stateless অথেনটিকেশন সিস্টেমে দীর্ঘকালীন অথেনটিকেশন সাপোর্ট দিতে পারেন।
  4. Seamless User Experience: Refresh Token ব্যবহার করার মাধ্যমে ব্যবহারকারীরা একাধিক বার লগইন না করেও অ্যাপ্লিকেশন ব্যবহার করতে পারে। Access Token-এর মেয়াদ শেষ হয়ে গেলেও, Refresh Token ব্যবহার করে নতুন Access Token তৈরি করা যায়, যা ব্যবহারকারীর অভিজ্ঞতাকে ভালো করে।
  5. Access Tokenের হালনাগাদ: যখন একটি ব্যবহারকারী একটি নতুন Access Token পায়, তখন তার পুরনো Access Token কে বাতিল করা হয়, এবং এটি শুধুমাত্র Refresh Token ব্যবহার করে প্রাপ্ত হয়। এটি সিস্টেমের নিরাপত্তা নিশ্চিত করে, কারণ পুরনো Access Token আর ব্যবহার করা যাবে না।

Refresh Token-এর কার্যপ্রণালী

  1. Login/Authentication:
    • ব্যবহারকারী সঠিক ক্রেডেনশিয়াল দিয়ে লগইন করলে, সার্ভার একটি Access Token এবং একটি Refresh Token প্রদান করে।
  2. Access Token Expiry:
    • ব্যবহারকারী অ্যাপ্লিকেশন ব্যবহার করতে থাকলে, কিছু সময় পর Access Token মেয়াদ শেষ হয়ে যাবে। তখন, অ্যাপ্লিকেশনটি Refresh Token ব্যবহার করে নতুন একটি Access Token রিকোয়েস্ট করবে।
  3. Generate New Access Token:
    • সার্ভার Refresh Token যাচাই করবে এবং যদি এটি বৈধ হয়, তবে নতুন Access Token প্রদান করবে।
  4. Access Control:
    • এক সময়ে একাধিক Access Token বা Refresh Token থাকলে, সেগুলি কেবল তখনই বৈধ হবে যদি তারা সঠিকভাবে যাচাই করা হয় এবং Refresh Token এর মেয়াদ শেষ না হয়ে থাকে।

Spring Security তে Refresh Token ব্যবহার করা

Spring Security-তে JWT ভিত্তিক Refresh Token ইমপ্লিমেন্ট করার জন্য সাধারণত নিচের স্টেপগুলো অনুসরণ করা হয়:

Step 1: JWT Token Utility Class

JWT Utility ক্লাসে Access Token এবং Refresh Token তৈরি ও যাচাই করার জন্য মেথড তৈরি করুন:

public class JwtUtil {
    private final String SECRET_KEY = "mySecretKey";

    public String generateAccessToken(String username) {
        return Jwts.builder()
                .setSubject(username)
                .setIssuedAt(new Date())
                .setExpiration(new Date(System.currentTimeMillis() + 1000 * 60 * 60)) // 1 hour validity
                .signWith(SignatureAlgorithm.HS256, SECRET_KEY)
                .compact();
    }

    public String generateRefreshToken(String username) {
        return Jwts.builder()
                .setSubject(username)
                .setIssuedAt(new Date())
                .setExpiration(new Date(System.currentTimeMillis() + 1000 * 60 * 60 * 24 * 7)) // 7 days validity
                .signWith(SignatureAlgorithm.HS256, SECRET_KEY)
                .compact();
    }
    
    public boolean validateToken(String token, String username) {
        String extractedUsername = extractUsername(token);
        return (username.equals(extractedUsername) && !isTokenExpired(token));
    }

    private String extractUsername(String token) {
        return extractClaims(token).getSubject();
    }

    private Claims extractClaims(String token) {
        return Jwts.parser()
                .setSigningKey(SECRET_KEY)
                .parseClaimsJws(token)
                .getBody();
    }

    private boolean isTokenExpired(String token) {
        return extractClaims(token).getExpiration().before(new Date());
    }
}

Step 2: Refresh Token Endpoint

একটি কন্ট্রোলার তৈরি করুন যেখানে ব্যবহারকারী তাদের Refresh Token প্রদান করবে এবং নতুন Access Token প্রাপ্ত করবে।

@RestController
public class TokenController {

    @Autowired
    private JwtUtil jwtUtil;

    @PostMapping("/refresh-token")
    public ResponseEntity<?> refreshToken(@RequestParam String refreshToken) {
        String username = jwtUtil.extractUsername(refreshToken);
        
        // Validate Refresh Token (You can check for validity and expiration)
        if (username != null && jwtUtil.validateToken(refreshToken, username)) {
            String newAccessToken = jwtUtil.generateAccessToken(username);
            return ResponseEntity.ok(newAccessToken);
        } else {
            return ResponseEntity.status(HttpStatus.FORBIDDEN).body("Invalid Refresh Token");
        }
    }
}

Step 3: Client-Side Usage

  • প্রথমে, login বা authentication রিকোয়েস্টে Access Token এবং Refresh Token প্রাপ্ত করুন।
  • যখন Access Token মেয়াদ শেষ হয়ে যায়, Refresh Token ব্যবহার করে Access Token পুনরুদ্ধার করুন।

Refresh Token-এর নিরাপত্তা

  1. Storage:
    • Refresh Token সাধারণত সার্ভারে অথবা secure HTTP-only cookie তে সংরক্ষণ করা হয়।
  2. Expiry & Rotation:
    • Refresh Token-এর মেয়াদ শেষ হলে এটি আর ব্যবহারযোগ্য থাকে না।
    • প্রক্রিয়া সম্পন্ন হলে, নতুন Refresh Token তৈরি করা উচিত।
  3. Revoke Mechanism:
    • Refresh Token-এর বিরুদ্ধে revoke বা বাতিল করার ব্যবস্থা থাকা উচিত যদি কোনো নিরাপত্তা সমস্যা ঘটে।

উপসংহার

Refresh Token ব্যবহারকারীর অভিজ্ঞতাকে আরো উন্নত করে এবং দীর্ঘ সময়ের জন্য নিরাপদ অথেনটিকেশন প্রদান করতে সাহায্য করে। এটি JWT এর সাথে যুক্ত করে অ্যাপ্লিকেশনের নিরাপত্তা এবং ব্যবহারকারীর অভিজ্ঞতাকে শক্তিশালী করে।

Content added By
Md Zahid Hasan

Spring Security তে JWT Refresh Token কনফিগার করা

96
96

JWT Authentication ব্যবহারের সময়, সাধারণত Access Token এর মেয়াদ শেষ হয়ে গেলে নতুন Access Token প্রাপ্ত করার জন্য একটি Refresh Token ব্যবহার করা হয়। Refresh Token দিয়ে একটি নতুন Access Token তৈরি করা যায়, যাতে ব্যবহারকারীর পুনরায় লগইন করার প্রয়োজন না হয়। এই প্রক্রিয়াটি Stateless Authentication এর সুবিধা বজায় রেখে নিরাপদে সেশন পরিচালনা করতে সাহায্য করে।

নিম্নে, Spring Security তে JWT Refresh Token কনফিগার করার জন্য ধাপে ধাপে নির্দেশনা দেওয়া হলো।


Step 1: JWT Token Generator তৈরি করুন

JWT Utility ক্লাস তৈরি করুন যা Access Token এবং Refresh Token উভয়ই জেনারেট করবে।

import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import io.jsonwebtoken.Claims;
import java.util.Date;

public class JwtUtil {

    private static final String SECRET_KEY = "secretKey";  // নিরাপদ রাখতে এই কীটি ভালোভাবে কনফিগার করতে হবে

    // Access Token জেনারেট করা
    public static String generateAccessToken(String username) {
        return Jwts.builder()
                .setSubject(username)
                .setIssuedAt(new Date())
                .setExpiration(new Date(System.currentTimeMillis() + 1000 * 60 * 15)) // 15 মিনিট
                .signWith(SignatureAlgorithm.HS256, SECRET_KEY)
                .compact();
    }

    // Refresh Token জেনারেট করা
    public static String generateRefreshToken(String username) {
        return Jwts.builder()
                .setSubject(username)
                .setIssuedAt(new Date())
                .setExpiration(new Date(System.currentTimeMillis() + 1000 * 60 * 60 * 24)) // 24 ঘন্টা
                .signWith(SignatureAlgorithm.HS256, SECRET_KEY)
                .compact();
    }

    // টোকেনের মধ্যে তথ্য বের করা
    public static Claims extractClaims(String token) {
        return Jwts.parser()
                .setSigningKey(SECRET_KEY)
                .parseClaimsJws(token)
                .getBody();
    }

    // টোকেনের ভ্যালিডিটি চেক করা
    public static boolean isTokenExpired(String token) {
        Date expiration = extractClaims(token).getExpiration();
        return expiration.before(new Date());
    }

    // টোকেন থেকে ইউজার নাম বের করা
    public static String extractUsername(String token) {
        return extractClaims(token).getSubject();
    }

    // টোকেন ভ্যালিডেশন
    public static boolean validateToken(String token, String username) {
        return (username.equals(extractUsername(token)) && !isTokenExpired(token));
    }
}

Step 2: JWT Refresh Token API তৈরি করুন

LoginController: Refresh Token API তৈরি করুন

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

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

    @Autowired
    private JwtUtil jwtUtil;

    @PostMapping("/login")
    public String login(@RequestParam String username, @RequestParam String password) {
        // এখানে ইউজারনেম এবং পাসওয়ার্ড চেক করতে হবে (ধরি, সফল লগইন)
        String accessToken = jwtUtil.generateAccessToken(username);
        String refreshToken = jwtUtil.generateRefreshToken(username);
        
        // ইউজারের জন্য access token এবং refresh token রিটার্ন করা
        return "Access Token: " + accessToken + "\nRefresh Token: " + refreshToken;
    }

    @PostMapping("/refresh")
    public String refreshToken(@RequestParam String refreshToken) {
        if (jwtUtil.isTokenExpired(refreshToken)) {
            return "Refresh Token expired!";
        }
        
        String username = jwtUtil.extractUsername(refreshToken);
        String newAccessToken = jwtUtil.generateAccessToken(username);
        
        return "New Access Token: " + newAccessToken;
    }
}
  1. /login রিকোয়েস্টে ইউজারনেম এবং পাসওয়ার্ড দিয়ে সফল লগইন হলে, Access Token এবং Refresh Token তৈরি হবে।
  2. /refresh রিকোয়েস্টে Refresh Token পাঠালে, যদি Refresh Token বৈধ থাকে, তবে নতুন Access Token জেনারেট হবে।

Step 3: Spring Security Configuration

Spring Security কনফিগারেশন তৈরি করতে হবে যাতে /login এবং /refresh এ অননুমোদিত অ্যাক্সেস বন্ধ করা যায়।

SecurityConfig:

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.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.csrf().disable()
            .authorizeRequests()
            .antMatchers("/auth/login", "/auth/refresh").permitAll()  // Login এবং Refresh API কে খোলা রাখা
            .anyRequest().authenticated()  // অন্য সব রিকোয়েস্টের জন্য Authentication প্রয়োজন
            .and()
            .formLogin().disable();  // ডিফল্ট লগইন ফর্ম নিষ্ক্রিয় করা
    }
}

Step 4: JWT Filter (Optional)

আপনি যদি JWT ব্যবহার করে API গুলোতে সিকিউরিটি পরিচালনা করতে চান, তবে একটি JWT Filter যুক্ত করতে পারেন। এটি নিশ্চিত করবে যে প্রতিটি API রিকোয়েস্টে Authorization হেডারে JWT পাঠানো হচ্ছে এবং সেটি ভ্যালিড কিনা চেক করবে।

import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.web.filter.OncePerRequestFilter;

import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class JwtFilter extends OncePerRequestFilter {

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
            throws ServletException, IOException {
        String authorizationHeader = request.getHeader("Authorization");

        if (authorizationHeader != null && authorizationHeader.startsWith("Bearer ")) {
            String token = authorizationHeader.substring(7);
            String username = JwtUtil.extractUsername(token);

            if (username != null && SecurityContextHolder.getContext().getAuthentication() == null) {
                if (JwtUtil.validateToken(token, username)) {
                    // Add authentication object to context
                    SecurityContextHolder.getContext().setAuthentication(new UsernamePasswordAuthenticationToken(username, null, new ArrayList<>()));
                }
            }
        }

        filterChain.doFilter(request, response);
    }
}

Step 5: Filter Config (JWT Filter যোগ করা)

@Configuration
public class FilterConfig {

    @Bean
    public FilterRegistrationBean<JwtFilter> jwtFilter() {
        FilterRegistrationBean<JwtFilter> registrationBean = new FilterRegistrationBean<>();
        registrationBean.setFilter(new JwtFilter());
        registrationBean.addUrlPatterns("/api/*");  // সমস্ত API রিকোয়েস্টে ফিল্টার কার্যকর হবে
        return registrationBean;
    }
}

Step 6: টেস্ট করুন

  1. Login রিকোয়েস্ট:
    • URL: POST http://localhost:8080/auth/login?username=user&password=pass
    • রেসপন্সে Access Token এবং Refresh Token পাবেন।
  2. Refresh Token রিকোয়েস্ট:
    • URL: POST http://localhost:8080/auth/refresh?refreshToken=<Refresh_Token>
    • রেসপন্সে New Access Token পাবেন।

উপসংহার:

Spring Security তে JWT Refresh Token কনফিগার করা একটি কার্যকরী সমাধান যেটি ব্যবহারকারীর সেশন ম্যানেজমেন্ট এবং অ্যাপ্লিকেশনের নিরাপত্তা উন্নত করতে সাহায্য করে। Access Token এর মেয়াদ শেষ হয়ে গেলে Refresh Token এর মাধ্যমে সহজেই নতুন Access Token তৈরি করা যায়, যাতে ব্যবহারকারীকে পুনরায় লগইন করতে না হয়।

Content added By
Md Zahid Hasan

Token Expiration Management এবং Refresh Token Generation

160
160

JWT (JSON Web Token) Authentication ব্যবহারের সময়, Token Expiration এবং Refresh Token তৈরি করা গুরুত্বপূর্ণ বিষয় হয়ে দাঁড়ায়। JWT-তে একটি নির্দিষ্ট সময়সীমা থাকে, যার পর টোকেনটির বৈধতা শেষ হয়ে যায় (Expiration)। তখন ব্যবহারকারীকে পুনরায় লগইন করতে হতে পারে বা Refresh Token ব্যবহার করে নতুন টোকেন পাওয়া যায়। এই প্রক্রিয়াগুলি Spring Security-তে কিভাবে কনফিগার করতে হয় তা আলোচনা করা হবে।


Token Expiration Management

JWT-এর expiration ফিল্ড ব্যবহারকারীকে একটি টোকেনের বৈধতার সময়সীমা নির্ধারণ করতে সাহায্য করে। যখন টোকেনটির সময়সীমা শেষ হয়, তখন এটি আর বৈধ থাকে না এবং ব্যবহারকারীকে পুনরায় অথেনটিকেট হতে হয়।

1. JWT Token এর Expiration সেট করা:

JWT Token তৈরি করার সময়, আপনি exp (expiration) প্যারামিটার ব্যবহার করতে পারেন। এই প্যারামিটারটি সাধারণত একটি সময় (epoch time) প্রকাশ করে, যার পরে টোকেনটি মেয়াদ উত্তীর্ণ হয়ে যাবে।

উদাহরণ:

import io.jsonwebtoken.*;
import java.util.Date;

public class JwtUtil {
    private final String SECRET_KEY = "your-256-bit-secret-key";
    private final long EXPIRATION_TIME = 1000 * 60 * 60 * 10; // 10 hours

    public String generateToken(String username) {
        return Jwts.builder()
                .setSubject(username)
                .setIssuedAt(new Date())
                .setExpiration(new Date(System.currentTimeMillis() + EXPIRATION_TIME)) // Set expiration
                .signWith(SignatureAlgorithm.HS256, SECRET_KEY)
                .compact();
    }

    public boolean isTokenExpired(String token) {
        return getExpirationDateFromToken(token).before(new Date());
    }

    public Date getExpirationDateFromToken(String token) {
        return Jwts.parserBuilder()
                .setSigningKey(SECRET_KEY)
                .build()
                .parseClaimsJws(token)
                .getBody()
                .getExpiration();
    }
}
  • setExpiration: Token এর Expiration Time নির্ধারণ করে।
  • isTokenExpired: Token মেয়াদ শেষ হয়েছে কিনা চেক করার জন্য ব্যবহৃত হয়।

2. Token Expiration যাচাই:

JWT এর Expiration যাচাই করার জন্য, আপনি isTokenExpired ফাংশন ব্যবহার করতে পারেন। যদি Expiration এর পরে রিকোয়েস্ট আসে, তবে টোকেন অবৈধ হিসেবে গণ্য হবে এবং পুনরায় লগইন করতে হবে।


Refresh Token Generation

JWT-র Access Token সাধারণত ছোট সময়ের জন্য মেয়াদী থাকে। যদি ব্যবহারকারী লগইন করার পর টোকেনটি মেয়াদোত্তীর্ণ হয়ে যায়, তাহলে Refresh Token ব্যবহার করে নতুন একটি Access Token তৈরি করা যেতে পারে। Refresh Token দীর্ঘমেয়াদী এবং এর মাধ্যমে নতুন Access Token জেনারেট করা যায়।

Refresh Token Generation কনফিগারেশন:

1. Refresh Token Class:

Refresh Token তৈরি করার জন্য আপনাকে একটি নতুন টোকেন তৈরির পদ্ধতি তৈরি করতে হবে, যেটি দীর্ঘমেয়াদী এবং এটি Token Expiration পর পুনরায় একটি নতুন Access Token ইস্যু করবে।

import io.jsonwebtoken.*;
import java.util.Date;

public class JwtUtil {

    private final String SECRET_KEY = "your-256-bit-secret-key";
    private final long ACCESS_TOKEN_EXPIRATION = 1000 * 60 * 15; // 15 minutes
    private final long REFRESH_TOKEN_EXPIRATION = 1000 * 60 * 60 * 24 * 7; // 7 days

    // Generate Access Token
    public String generateAccessToken(String username) {
        return Jwts.builder()
                .setSubject(username)
                .setIssuedAt(new Date())
                .setExpiration(new Date(System.currentTimeMillis() + ACCESS_TOKEN_EXPIRATION))
                .signWith(SignatureAlgorithm.HS256, SECRET_KEY)
                .compact();
    }

    // Generate Refresh Token
    public String generateRefreshToken(String username) {
        return Jwts.builder()
                .setSubject(username)
                .setIssuedAt(new Date())
                .setExpiration(new Date(System.currentTimeMillis() + REFRESH_TOKEN_EXPIRATION))
                .signWith(SignatureAlgorithm.HS256, SECRET_KEY)
                .compact();
    }

    // Check if the Access Token is expired
    public boolean isTokenExpired(String token) {
        return getExpirationDateFromToken(token).before(new Date());
    }

    public Date getExpirationDateFromToken(String token) {
        return Jwts.parserBuilder()
                .setSigningKey(SECRET_KEY)
                .build()
                .parseClaimsJws(token)
                .getBody()
                .getExpiration();
    }

    public String extractUsername(String token) {
        return Jwts.parserBuilder()
                .setSigningKey(SECRET_KEY)
                .build()
                .parseClaimsJws(token)
                .getBody()
                .getSubject();
    }
}

Explanation:

  1. generateAccessToken: এই ফাংশনটি ১৫ মিনিটের জন্য Access Token তৈরি করবে।
  2. generateRefreshToken: এই ফাংশনটি ৭ দিনের জন্য Refresh Token তৈরি করবে।

Step 2: Refresh Token API

একটি API তৈরি করতে হবে যা Refresh Token গ্রহণ করে এবং নতুন Access Token প্রদান করবে। যখন একটি Access Token মেয়াদোত্তীর্ণ হয়ে যাবে, তখন Refresh Token ব্যবহার করে নতুন Access Token জেনারেট করা হবে।

Refresh Token API উদাহরণ:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

@RestController
public class AuthController {

    @Autowired
    private JwtUtil jwtUtil;

    @PostMapping("/login")
    public String login(@RequestBody AuthRequest authRequest) {
        // Here you authenticate the user (omitting for brevity)
        String accessToken = jwtUtil.generateAccessToken(authRequest.getUsername());
        String refreshToken = jwtUtil.generateRefreshToken(authRequest.getUsername());
        return "Access Token: " + accessToken + ", Refresh Token: " + refreshToken;
    }

    @PostMapping("/refresh-token")
    public String refreshToken(@RequestBody RefreshTokenRequest refreshTokenRequest) {
        String refreshToken = refreshTokenRequest.getRefreshToken();

        // Verify the refresh token
        if (jwtUtil.isTokenExpired(refreshToken)) {
            throw new RuntimeException("Refresh token expired");
        }

        String username = jwtUtil.extractUsername(refreshToken);
        String newAccessToken = jwtUtil.generateAccessToken(username);
        return "New Access Token: " + newAccessToken;
    }
}

class AuthRequest {
    private String username;
    private String password;
    // Getters and Setters
}

class RefreshTokenRequest {
    private String refreshToken;
    // Getter and Setter
}

Explanation:

  1. /login API: লগইন করলে Access Token এবং Refresh Token দেওয়া হবে।
  2. /refresh-token API: ব্যবহারকারী যখন Access Token নিয়ে রিকোয়েস্ট করবেন এবং টোকেনটি যদি মেয়াদোত্তীর্ণ হয়ে থাকে, তবে Refresh Token ব্যবহার করে নতুন Access Token প্রদান করা হবে।

Step 3: Token Expiration Management

  • Access Token Expiration: সাধারণত ছোট সময়সীমার জন্য Access Token তৈরি করা হয়। এই টোকেনটি ব্যবহারকারী লগইন করার পর কিছু সময়ের জন্য বৈধ থাকবে (যেমন ১৫ মিনিট)।
  • Refresh Token Expiration: Refresh Token দীর্ঘমেয়াদী থাকে (যেমন ৭ দিন) এবং এটি ব্যবহার করে নতুন Access Token জেনারেট করা যায়।
  • Token Validation: Expired Token চেক করা হয়। যদি Token মেয়াদোত্তীর্ণ হয়ে যায়, তাহলে Refresh Token ব্যবহার করে নতুন Token জেনারেট করতে হবে।

উপসংহার:

Spring Security-তে Token Expiration এবং Refresh Token Generation এর মাধ্যমে আপনি JWT Authentication-কে আরো নিরাপদ এবং ব্যবহারকারী-বান্ধব করতে পারেন।

  1. Access Token ছোট সময়ের জন্য ব্যবহৃত হয় এবং Refresh Token দীর্ঘমেয়াদী।
  2. যখন Access Token মেয়াদোত্তীর্ণ হয়, তখন Refresh Token ব্যবহার করে নতুন Access Token জেনারেট করা যায়।
  3. JWT Utility ক্লাস এবং Refresh Token API তৈরি করে আপনি সহজে এই ফিচারটি ইনটিগ্রেট করতে পারেন।
Content added By
Md Zahid Hasan

উদাহরণ সহ Refresh Token বাস্তবায়ন

87
87

Refresh Token হল একটি নিরাপদ উপায় যা ব্যবহারকারীদের তাদের অ্যাপ্লিকেশন সেশনকে পুনরায় বৈধ করতে সহায়তা করে যখন তাদের Access Token মেয়াদ শেষ হয়ে যায়। সাধারণত, Access Token এর মেয়াদ সীমিত (যেমন 1 ঘণ্টা) এবং একবার এটি শেষ হয়ে গেলে, ব্যবহারকারীদের নতুন Token পেতে Refresh Token প্রয়োজন। Refresh Token সাধারণত দীর্ঘ মেয়াদী এবং নিরাপদে সংরক্ষিত হয়।

Spring Security এর সাথে Refresh Token বাস্তবায়ন করতে আমরা নিম্নলিখিত পদক্ষেপ অনুসরণ করতে পারি:

  1. Access Token এবং Refresh Token তৈরি করা
  2. Refresh Token যাচাই এবং নতুন Access Token তৈরি করা
  3. Spring Security Configuration এর মাধ্যমে Filter এবং Endpoint তৈরি করা

1. Access Token এবং Refresh Token তৈরি করা

প্রথমে, আমরা JWT ব্যবহার করে Access Token এবং Refresh Token তৈরি করব। Access Token মেয়াদ সীমিত এবং Refresh Token দীর্ঘ মেয়াদী থাকে।

JWT Token Utility:

import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import java.util.Date;

public class JwtUtil {

    private static final String SECRET_KEY = "mySecretKey";
    private static final long ACCESS_TOKEN_EXPIRATION = 3600000; // 1 hour
    private static final long REFRESH_TOKEN_EXPIRATION = 86400000; // 24 hours

    // Access Token তৈরি
    public static String generateAccessToken(String username) {
        return Jwts.builder()
                .setSubject(username)
                .setIssuedAt(new Date())
                .setExpiration(new Date(System.currentTimeMillis() + ACCESS_TOKEN_EXPIRATION))
                .signWith(SignatureAlgorithm.HS256, SECRET_KEY)
                .compact();
    }

    // Refresh Token তৈরি
    public static String generateRefreshToken(String username) {
        return Jwts.builder()
                .setSubject(username)
                .setIssuedAt(new Date())
                .setExpiration(new Date(System.currentTimeMillis() + REFRESH_TOKEN_EXPIRATION))
                .signWith(SignatureAlgorithm.HS256, SECRET_KEY)
                .compact();
    }
}

2. Refresh Token যাচাই এবং নতুন Access Token তৈরি করা

ব্যবহারকারী যখন তাদের Access Token এর মেয়াদ শেষ হয়ে যায়, তখন তারা Refresh Token পাঠায় এবং নতুন Access Token পেতে পারে।

Refresh Token Endpoint:

import org.springframework.web.bind.annotation.*;

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

    // Refresh Token দিয়ে নতুন Access Token তৈরি করা
    @PostMapping("/refresh")
    public ResponseEntity<?> refreshToken(@RequestBody TokenRefreshRequest request) {
        String refreshToken = request.getRefreshToken();

        // Refresh Token যাচাই করুন
        if (JwtUtil.validateToken(refreshToken)) {
            String username = JwtUtil.getUsernameFromToken(refreshToken);
            String newAccessToken = JwtUtil.generateAccessToken(username);

            return ResponseEntity.ok(new JwtResponse(newAccessToken));
        } else {
            return ResponseEntity.status(HttpStatus.FORBIDDEN).body("Invalid refresh token");
        }
    }
}

TokenRefreshRequest:

public class TokenRefreshRequest {
    private String refreshToken;

    // Getter এবং Setter
    public String getRefreshToken() {
        return refreshToken;
    }

    public void setRefreshToken(String refreshToken) {
        this.refreshToken = refreshToken;
    }
}

JwtResponse:

public class JwtResponse {
    private String accessToken;

    // Constructor, Getter এবং Setter
    public JwtResponse(String accessToken) {
        this.accessToken = accessToken;
    }

    public String getAccessToken() {
        return accessToken;
    }

    public void setAccessToken(String accessToken) {
        this.accessToken = accessToken;
    }
}

3. Spring Security Configuration এবং Filter:

Spring Security Configuration এর মধ্যে আমরা JWT Authentication Filter এবং JWT Refresh Token Filter তৈরি করতে পারি।

JWT Authentication Filter:

import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
import io.jsonwebtoken.Claims;

public class JwtAuthenticationFilter extends OncePerRequestFilter {

    private static final String SECRET_KEY = "mySecretKey";

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
            throws ServletException, IOException {

        String token = request.getHeader("Authorization");

        if (token != null && token.startsWith("Bearer ")) {
            token = token.substring(7); // "Bearer " বাদ দিন

            if (JwtUtil.validateToken(token)) {
                Claims claims = JwtUtil.validateToken(token);
                String username = claims.getSubject();

                UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(username, null, new ArrayList<>());
                SecurityContextHolder.getContext().setAuthentication(authentication);
            }
        }

        filterChain.doFilter(request, response);
    }
}

JWT Token Validation Utility:

public class JwtUtil {

    private static final String SECRET_KEY = "mySecretKey";

    public static Claims validateToken(String token) {
        return Jwts.parser()
                .setSigningKey(SECRET_KEY)
                .parseClaimsJws(token)
                .getBody();
    }

    public static String getUsernameFromToken(String token) {
        return validateToken(token).getSubject();
    }
}

4. Spring Security Configuration:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.csrf().disable()
            .authorizeRequests()
                .antMatchers("/auth/refresh").permitAll()
                .anyRequest().authenticated()
            .and()
            .addFilter(new JwtAuthenticationFilter());
    }
}

প্রকল্পের Flow:

  1. ব্যবহারকারী প্রথমবার লগইন করলে, একটি Access Token এবং একটি Refresh Token জেনারেট করা হবে এবং তাদের ক্লায়েন্টে পাঠানো হবে।
  2. Access Token এর মেয়াদ শেষ হলে, ব্যবহারকারী তাদের Refresh Token পাঠিয়ে নতুন Access Token পেতে পারবে।
  3. Refresh Token মেয়াদ শেষ হলে, ব্যবহারকারী আবার লগইন করতে হবে।

Spring Security Refresh Token এর সুবিধা:

  1. সতর্কভাবে Access Token এর মেয়াদ সীমিত করা:
    • Access Token এর মেয়াদ কম রাখলে, এটি কম সময়ের জন্য বৈধ থাকে এবং সুরক্ষিত থাকে।
  2. ব্যবহারকারী অভিজ্ঞতা উন্নত করা:
    • ব্যবহারকারীদের পুনরায় লগইন না করেই নতুন Access Token পাওয়া যায়।
  3. Refresh Token এর সুরক্ষা:
    • Refresh Token সাধারণত দীর্ঘমেয়াদী হয় এবং এটি সুরক্ষিতভাবে সংরক্ষণ করা উচিত।
  4. Scalability এবং Stateless Authentication:
    • Refresh Token এর মাধ্যমে নিরাপদ Stateless Authentication নিশ্চিত করা যায়।

এভাবে Spring Security এ Refresh Token ইমপ্লিমেন্ট করা যায়, যা Access Token মেয়াদ শেষ হলে ব্যবহারকারীদের সহজেই সেশন পুনঃপ্রবিষ্ট করতে সহায়ক।

Content added By
Md Zahid Hasan

Read more

Spring Security এর পরিচিতি Spring Security Setup এবং কনফিগারেশন Spring Security এর Authentication এবং Authorization Spring Security এর Basic Authentication Spring Security এর Form-Based Authentication

Self Test

To attend a self test please, login first. click here to login
Login

Add New Bookmark

Fill up the form and submit
To add a bookmark, please login first. click here to login
Login

Error Report

Fill up the form and submit
To report an error please, login first. click here to login
Login

Add Video

Fill up the form and submit
To add a video, please login first. click here to login
Login
©2025 Satt Academy. All rights reserved.
Privacy Policy
SATT ACADEMY
SATT ACADEMY
Continue with Google
Continue with Facebook

or

Forgot password?

Don't have an account? Register

Notification

Avatar

Action

All Notifications

User Avatar
Lorem ipsum dolor sit amet consectetur adipisicing elit. Eaque, officia!

Lorem ipsum dolor, sit amet consectetur adipisicing elit. Ducimus nihil, quo, quis minus aspernatur expedita, incidunt facilis aliquid inventore voluptate dolores accusantium laborum labore a dolorum dolore omnis qui? Consequuntur sed facilis repellendus corrupti amet in quibusdam ducimus illo autem, a praesentium.

1 hour ago

User Avatar
Lorem ipsum dolor sit amet consectetur adipisicing elit. Eaque, officia!

Lorem ipsum dolor, sit amet consectetur adipisicing elit. Ducimus nihil, quo, quis minus aspernatur expedita, incidunt facilis aliquid inventore voluptate dolores accusantium laborum labore a dolorum dolore omnis qui? Consequuntur sed facilis repellendus corrupti amet in quibusdam ducimus illo autem, a praesentium.

1 hour ago

User Avatar
Lorem ipsum dolor sit amet consectetur adipisicing elit. Eaque, officia!

Lorem ipsum dolor, sit amet consectetur adipisicing elit. Ducimus nihil, quo, quis minus aspernatur expedita, incidunt facilis aliquid inventore voluptate dolores accusantium laborum labore a dolorum dolore omnis qui? Consequuntur sed facilis repellendus corrupti amet in quibusdam ducimus illo autem, a praesentium.

1 hour ago

User Avatar
Lorem ipsum dolor sit amet consectetur adipisicing elit. Eaque, officia!

Lorem ipsum dolor, sit amet consectetur adipisicing elit. Ducimus nihil, quo, quis minus aspernatur expedita, incidunt facilis aliquid inventore voluptate dolores accusantium laborum labore a dolorum dolore omnis qui? Consequuntur sed facilis repellendus corrupti amet in quibusdam ducimus illo autem, a praesentium.

1 hour ago

User Avatar
Lorem ipsum dolor sit amet consectetur adipisicing elit. Eaque, officia!

Lorem ipsum dolor, sit amet consectetur adipisicing elit. Ducimus nihil, quo, quis minus aspernatur expedita, incidunt facilis aliquid inventore voluptate dolores accusantium laborum labore a dolorum dolore omnis qui? Consequuntur sed facilis repellendus corrupti amet in quibusdam ducimus illo autem, a praesentium.

1 hour ago

User Avatar
Lorem ipsum dolor sit amet consectetur adipisicing elit. Eaque, officia!

Lorem ipsum dolor, sit amet consectetur adipisicing elit. Ducimus nihil, quo, quis minus aspernatur expedita, incidunt facilis aliquid inventore voluptate dolores accusantium laborum labore a dolorum dolore omnis qui? Consequuntur sed facilis repellendus corrupti amet in quibusdam ducimus illo autem, a praesentium.

1 hour ago

User Avatar
Lorem ipsum dolor sit amet consectetur adipisicing elit. Eaque, officia!

Lorem ipsum dolor, sit amet consectetur adipisicing elit. Ducimus nihil, quo, quis minus aspernatur expedita, incidunt facilis aliquid inventore voluptate dolores accusantium laborum labore a dolorum dolore omnis qui? Consequuntur sed facilis repellendus corrupti amet in quibusdam ducimus illo autem, a praesentium.

1 hour ago

User Avatar
Lorem ipsum dolor sit amet consectetur adipisicing elit. Eaque, officia!

Lorem ipsum dolor, sit amet consectetur adipisicing elit. Ducimus nihil, quo, quis minus aspernatur expedita, incidunt facilis aliquid inventore voluptate dolores accusantium laborum labore a dolorum dolore omnis qui? Consequuntur sed facilis repellendus corrupti amet in quibusdam ducimus illo autem, a praesentium.

1 hour ago

User Avatar
Lorem ipsum dolor sit amet consectetur adipisicing elit. Eaque, officia!

Lorem ipsum dolor, sit amet consectetur adipisicing elit. Ducimus nihil, quo, quis minus aspernatur expedita, incidunt facilis aliquid inventore voluptate dolores accusantium laborum labore a dolorum dolore omnis qui? Consequuntur sed facilis repellendus corrupti amet in quibusdam ducimus illo autem, a praesentium.

1 hour ago

User Avatar
Lorem ipsum dolor sit amet consectetur adipisicing elit. Eaque, officia!

Lorem ipsum dolor, sit amet consectetur adipisicing elit. Ducimus nihil, quo, quis minus aspernatur expedita, incidunt facilis aliquid inventore voluptate dolores accusantium laborum labore a dolorum dolore omnis qui? Consequuntur sed facilis repellendus corrupti amet in quibusdam ducimus illo autem, a praesentium.

1 hour ago

Promotion
    i

    Login to continue...

    If you need more content, you need to login