Swift में JWT टोकन (iOS/macOS): पूरी गाइड
JSON Web Token (JWT) एक खुला मानक (RFC 7519) है जो JSON पर आधारित एक्सेस टोकन बनाने के लिए उपयोग होता है। JWT का व्यापक रूप से क्लाइंट और सर्वर के बीच प्रमाणीकरण और सूचना आदान-प्रदान के लिए उपयोग किया जाता है। Apple इकोसिस्टम (iOS, macOS, watchOS, tvOS) में, REST API, माइक्रोसर्विसेज या किसी भी सुरक्षित डेटा ट्रांसफर सिस्टम के साथ काम करने वाले ऐप बनाते समय JWT के साथ काम करना बेहद जरूरी हो जाता है।
यह लेख SwiftJWT लाइब्रेरी पर केंद्रित है - जो Swift भाषा में JWT के साथ काम करने का सबसे लोकप्रिय और सक्रिय रूप से समर्थित समाधान है। हम इंस्टॉलेशन, बुनियादी ऑपरेशन (बनाना, हस्ताक्षर करना, सत्यापन) और उन्नत उपयोग के तरीकों पर चर्चा करेंगे।
SwiftJWT क्या है?
SwiftJWT Swift के लिए एक हल्की, नेटिव लाइब्रेरी है जो आपको निम्नलिखित सुविधाएं देती है:
- मनमाने claims (दावों) के साथ JWT बनाना
- एल्गोरिदम का उपयोग करके टोकन पर हस्ताक्षर करना: HS256, HS384, HS512 (सममित) और RS256, RS384, RS512 (असममित, RSA आधारित)
- हस्ताक्षर और टोकन की समय सीमा सत्यापित करना
- हस्ताक्षर जांचे बिना payload डिकोड करना (जैसे, क्लाइंट पर जानकारी दिखाने के लिए)
- कस्टम डेटा और मानक फ़ील्ड (iss, sub, exp, iat आदि) के साथ काम करना
यह लाइब्रेरी पूरी तरह से Swift में लिखी गई है, इसे किसी बाहरी डिपेंडेंसी (Foundation और Security के अलावा) की आवश्यकता नहीं है, और यह Swift Package Manager (SPM), CocoaPods और Carthage के साथ संगत है।
Swift Package Manager के माध्यम से इंस्टॉलेशन
Xcode के माध्यम से या सीधे Package.swift में पैकेज जोड़ें:
// Package.swift
dependencies: [
.package(url: "https://github.com/Kitura/Swift-JWT.git", from: "4.0.0")
],
targets: [
.target(name: "YourTarget", dependencies: ["SwiftJWT"])
]
JWT के साथ बुनियादी ऑपरेशन
1. टोकन बनाना और हस्ताक्षर करना (HS256)
सबसे सरल मामला - सममित कुंजी का उपयोग करके टोकन बनाना:
import SwiftJWT
// 1. Claims (दावों) की संरचना परिभाषित करें
struct MyClaims: Claims {
let iss: String
let sub: String
let exp: Date
let admin: Bool
let customData: String
}
// 2. Claims का इंस्टेंस बनाएं
let claims = MyClaims(
iss: "com.yourcompany.app",
sub: "user123",
exp: Date(timeIntervalSinceNow: 3600), // +1 घंटा
admin: true,
customData: "some_value"
)
// 3. कुंजी परिभाषित करें (HS256 के लिए - कोई भी स्ट्रिंग)
let secretKey = "your-256-bit-secret".data(using: .utf8)!
// 4. JWT बनाएं
var jwt = JWT(claims: claims)
let signedJWT = try jwt.sign(using: .hs256(key: secretKey))
print("बनाया गया टोकन:\n\(signedJWT)")
2. टोकन सत्यापन और डिकोडिंग
// हस्ताक्षर और समय सीमा की जांच के साथ सत्यापन
let receivedToken = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
do {
// सत्यापित करें और डिकोड करें
let verifiedJWT = try JWT<MyClaims>.verify(token: receivedToken, using: .hs256(key: secretKey))
print("टोकन मान्य है। Claims: \(verifiedJWT.claims)")
// विशिष्ट फ़ील्ड जांचें
if verifiedJWT.claims.admin {
print("उपयोगकर्ता व्यवस्थापक है")
}
} catch {
print("सत्यापन में त्रुटि: \(error)")
// संभावित त्रुटियां: expiredToken, invalidSignature, malformedToken
}
// बिना सत्यापन के डिकोडिंग (केवल डेटा पढ़ने के लिए)
if let payload = try? JWTDecoder().decodePayload(from: receivedToken) {
print("Payload (बिना जांच): \(payload)")
}
3. असममित कुंजियों के साथ काम करना (RS256)
प्रोडक्शन वातावरण के लिए असममित एन्क्रिप्शन (RSA) का उपयोग करने की सलाह दी जाती है। सर्वर प्राइवेट कुंजी से टोकन पर हस्ताक्षर करता है, और क्लाइंट पब्लिक कुंजी से सत्यापित करता है:
// कुंजी जनरेशन (आमतौर पर सर्वर पर किया जाता है)
let privateKey = """
-----BEGIN RSA PRIVATE KEY-----