परिचय: क्यों OAuth 2.0 और JWT iOS ऐप्स के लिए मानक हैं
\nआधुनिक मोबाइल ऐप्स शायद ही कभी अलग-थलग काम करते हैं। उनमें से अधिकांश दूरस्थ API के साथ इंटरैक्ट करते हैं, जिसके लिए सुरक्षित उपयोगकर्ता प्रमाणीकरण और प्राधिकरण की आवश्यकता होती है। Apple पारिस्थितिकी तंत्र (iOS, macOS, watchOS) में, OAuth 2.0 (एक्सेस डेलिगेशन प्रोटोकॉल) और JWT (JSON Web Token - एक कॉम्पैक्ट टोकन प्रारूप) का संयोजन डी-फैक्टो मानक बन गया है। यह संयोजन लचीलापन, सुरक्षा और एकीकरण में आसानी सुनिश्चित करता है।
\nइस लेख में, हम शुष्क सिद्धांत में गहराई से नहीं जाएंगे। इसके बजाय, हम Swift पर व्यावहारिक कार्यान्वयन पर चर्चा करेंगे। आप सीखेंगे कि OAuth 2.0 के माध्यम से एक्सेस टोकन कैसे प्राप्त करें, इसे Keychain में सुरक्षित रूप से कैसे स्टोर करें, क्लाइंट पर JWT को कैसे डीकोड करें, और उपयोगकर्ता की भागीदारी के बिना टोकन को कैसे रिफ्रेश करें। सभी कोड उदाहरण वास्तविक प्रोजेक्ट में उपयोग के लिए तैयार हैं।
\n\n1. Swift पर OAuth 2.0 आर्किटेक्चर: अनुरोध से टोकन तक
\nशुरू करने के लिए, हम फ्लो (प्रवाह) तय करेंगे। मोबाइल ऐप्स में, Authorization Code Flow with PKCE (Proof Key for Code Exchange) का सबसे अधिक उपयोग किया जाता है। यह सार्वजनिक क्लाइंट (मोबाइल ऐप्स सीक्रेट स्टोर नहीं कर सकते) के लिए सबसे सुरक्षित विकल्प है।
\nOAuth कॉन्फ़िगरेशन के लिए एक स्ट्रक्चर बनाएं:
\nstruct OAuthConfig {\n let clientID: String\n let redirectURI: String\n let authorizationEndpoint: String\n let tokenEndpoint: String\n let scope: String\n}\nपहला कदम प्राधिकरण के लिए URL बनाना है। PKCE के लिए, हमें codeVerifier और इसका SHA256 हैश - codeChallenge उत्पन्न करना होगा:
import Foundation\nimport CommonCrypto\n\nclass PKCEGenerator {\n static func generateCodeVerifier() -> String {\n var buffer = [UInt8](repeating: 0, count: 32)\n _ = SecRandomCopyBytes(kSecRandomDefault, buffer.count, &buffer)\n return Data(buffer).base64URLEncodedString()\n }\n \n static func generateCodeChallenge(from verifier: String) -> String {\n guard let data = verifier.data(using: .utf8) else { return "" }\n var hash = [UInt8](repeating: 0, count: Int(CC_SHA256_DIGEST_LENGTH))\n data.withUnsafeBytes { \n _ = CC_SHA256($0.baseAddress, CC_LONG(data.count), &hash)\n }\n return Data(hash).base64URLEncodedString()\n }\n}\n\nextension Data {\n func base64URLEncodedString() -> String {\n return self.base64EncodedString()\n .replacingOccurrences(of: "+", with: "-")\n .replacingOccurrences(of: "/", with: "_")\n .replacingOccurrences(of: "=", with: "")\n }\n}\nअब ब्राउज़र में खोलने के लिए URL बनाएं (ASWebAuthenticationSession के माध्यम से):
func buildAuthorizationURL(config: OAuthConfig, codeChallenge: String) -> URL? {\n var components = URLComponents(string: config.authorizationEndpoint)\n components?.queryItems = [\n URLQueryItem(name: "response_type", value: "code"),\n URLQueryItem(name: "client_id", value: config.clientID),\n URLQueryItem(name: "redirect_uri", value: config.redirectURI),\n URLQueryItem(name: "scope", value: config.scope),\n URLQueryItem(name: "code_challenge", value: codeChallenge),\n URLQueryItem(name: "code_challenge_method", value: "S256")\n ]\n return components?.url\n}\nसफल प्राधिकरण के बाद, उपयोगकर्ता को code पैरामीटर के साथ redirectURI पर रीडायरेक्ट किया जाएगा। इस कोड को टोकन के लिए एक्सचेंज किया जाता है:
func exchangeCodeForToken(config: OAuthConfig, code: String, codeVerifier: String) async throws -> TokenResponse {\n let url = URL(string: config.tokenEndpoint)!\n var request = URLRequest(url: url)\n request.httpMethod = "POST"\n request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")\n \n let body = "grant_type=authorization_code" +\n "&co