@@ -100,5 +100,70 @@ class PosmLoginViewModel: ObservableObject {
100100 self . isLoginSuccess = true
101101 }
102102 }
103+
104+ func loginWithRefreshToken( refreshToken: String ) {
105+ isLoading = true
106+
107+ TokenRefresher . shared. refreshToken ( refreshToken: refreshToken) { [ weak self] result, error in
108+ DispatchQueue . main. async { [ weak self, result, error] in
109+ self ? . isLoading = false
110+
111+ self ? . loggedIn = result
112+ self ? . isLoginSuccess = result
113+ self ? . hasLoginFailed = !result
114+ if let _ = error {
115+ self ? . loginFailedMessage = L10n . Localizable. invalidCredentials
116+ }
117+
118+ guard result,
119+ let accessToken = KeychainManager . load ( key: " accessToken " ) ,
120+ let email = self ? . emailIDfromJWT ( token: accessToken) else {
121+ return
122+ }
123+ _ = KeychainManager . save ( . username, value: email, for: APIConfiguration . shared. environment)
124+ }
125+ }
126+ }
127+
128+ private func emailIDfromJWT( token: String ) -> String ? {
129+ let segments = token. components ( separatedBy: " . " )
130+ guard segments. count == 3 else {
131+ debugPrint ( " Invalid JWT format. " )
132+ return nil
133+ }
134+
135+ let payloadSegment = segments [ 1 ]
136+ var base64 = payloadSegment
137+ . replacingOccurrences ( of: " - " , with: " + " )
138+ . replacingOccurrences ( of: " _ " , with: " / " )
139+
140+ let remainingLength = base64. count % 4
141+ if remainingLength > 0 {
142+ let padding = String ( repeating: " = " , count: 4 - remainingLength)
143+ base64 = base64 + padding
144+ }
145+
146+ guard let data = Data ( base64Encoded: base64) else {
147+ debugPrint ( " Could not Base64URL decode the payload. " )
148+ return nil
149+ }
150+
151+ do {
152+ guard let jsonObject = try JSONSerialization . jsonObject ( with: data, options: [ ] ) as? [ String : Any ] else {
153+ debugPrint ( " Could not parse payload data as JSON object. " )
154+ return nil
155+ }
156+
157+ if let email = jsonObject [ " email " ] as? String {
158+ return email
159+ } else {
160+ debugPrint ( " Email claim not found in JWT payload, or is not a String. " )
161+ return nil
162+ }
163+ } catch {
164+ debugPrint ( " Error parsing JSON payload: \( error) " )
165+ return nil
166+ }
167+ }
103168}
104169
0 commit comments