Kotlin में JWT टोकन: जनरेशन, वेरिफिकेशन और io.jsonwebtoken का उपयोग

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

Kotlin में JWT टोकन: jjwt लाइब्रेरी के साथ पूरी गाइड

आधुनिक वेब डेवलपमेंट में JWT (JSON Web Tokens) क्लाइंट और सर्वर के बीच ऑथेंटिकेशन और डेटा एक्सचेंज का मानक बन गया है। Kotlin इकोसिस्टम में, खासकर Spring Boot या Ktor पर बैकएंड एप्लिकेशन बनाते समय, JWT के साथ काम करना अक्सर ज़रूरी होता है। इस आर्टिकल में हम io.jsonwebtoken (jjwt) लाइब्रेरी को विस्तार से समझेंगे - जो Java/Kotlin में JWT के लिए सबसे लोकप्रिय टूल है।

JWT क्या है?

JWT दो पक्षों के बीच क्लेम (claims) को प्रस्तुत करने का एक कॉम्पैक्ट, URL-सुरक्षित तरीका है। टोकन तीन भागों से बना होता है, जो डॉट से अलग होते हैं:

  • Header - हेडर, जिसमें टोकन का प्रकार और साइनिंग एल्गोरिदम (जैसे HS256, RS256) होता है।
  • Payload - पेलोड, जिसमें क्लेम होते हैं: sub (सब्जेक्ट), iat (जारी करने का समय), exp (समाप्ति का समय) और कस्टम डेटा।
  • Signature - सिग्नेचर, जो सीक्रेट की या की पेयर का उपयोग करके बनाया जाता है।

लाइब्रेरी को जोड़ना

Kotlin में JWT के साथ काम करने के लिए हम jjwt (io.jsonwebtoken) का उपयोग करेंगे। build.gradle.kts में डिपेंडेंसी जोड़ें:

dependencies {
    implementation("io.jsonwebtoken:jjwt-api:0.12.6")
    runtimeOnly("io.jsonwebtoken:jjwt-impl:0.12.6")
    runtimeOnly("io.jsonwebtoken:jjwt-jackson:0.12.6") // JSON पार्सिंग के लिए
}

JWT टोकन जनरेट करना

टोकन बनाने के लिए सीक्रेट की सेट करें, क्लेम जोड़ें और टोकन को साइन करें। Kotlin में उदाहरण:

import io.jsonwebtoken.Jwts
import io.jsonwebtoken.security.Keys
import java.util.Date
import javax.crypto.SecretKey

fun generateToken(userId: String, secret: String): String {
    val key: SecretKey = Keys.hmacShaKeyFor(secret.toByteArray())
    
    val now = Date()
    val expiration = Date(now.time + 3600_000) // +1 घंटा
    
    return Jwts.builder()
        .subject(userId)
        .issuedAt(now)
        .expiration(expiration)
        .claim("role", "USER")
        .signWith(key)
        .compact()
}

JWT को वेरिफाई और पार्स करना

क्लाइंट से टोकन प्राप्त करने पर उसकी सिग्नेचर और एक्सपायरी चेक करें। Jwts.parser() का उपयोग करें:

import io.jsonwebtoken.JwtException
import io.jsonwebtoken.Jwts
import io.jsonwebtoken.security.Keys
import javax.crypto.SecretKey

fun validateToken(token: String, secret: String): Boolean {
    return try {
        val key: SecretKey = Keys.hmacShaKeyFor(secret.toByteArray())
        Jwts.parser()
            .verifyWith(key)
            .build()
            .parseSignedClaims(token)
        true
    } catch (e: JwtException) {
        false
    }
}

fun extractUserId(token: String, secret: String): String? {
    return try {
        val key: SecretKey = Keys.hmacShaKeyFor(secret.toByteArray())
        val claims = Jwts.parser()
            .verifyWith(key)
            .build()
            .parseSignedClaims(token)
            .payload
        claims.subject
    } catch (e: Exception) {
        null
    }
}

कस्टम क्लेम के साथ काम करना

आप पेलोड में कोई भी मनमाना डेटा जोड़ सकते हैं। उदाहरण के लिए, यूज़र का ईमेल या रोल स्टोर करें:

fun generateTokenWithCustomClaims(userId: String, email: String, secret: String): String {
    val key = Keys.hmacShaKeyFor(secret.toByteArray())
    
    return Jwts.builder()
        .subject(userId)
        .claim("email", email)
        .claim("isAdmin", false)
        .issuedAt(Date())
        .expiration(Date(System.currentTimeMillis() + 3600_000))
        .signWith(key)
        .compact()
}

fun extractCustomClaim(token: String, secret: String): String? {
    val key = Keys.hmacShaKeyFor(secret.toByteArray())
    val claims = Jwts.parser()
        .verifyWith(key)
        .build()
        .parseSignedClaims(token)
        .payload
    return claims.get("email", String::class.java)
}

अनुशंसाएँ