Sfoglia il codice sorgente

[Auth] Token management cleanup (#13325)

Paul Beusterien 1 anno fa
parent
commit
dfdc1bacf3
1 ha cambiato i file con 76 aggiunte e 134 eliminazioni
  1. 76 134
      FirebaseAuth/Sources/Swift/User/User.swift

+ 76 - 134
FirebaseAuth/Sources/Swift/User/User.swift

@@ -702,23 +702,22 @@ extension User: NSSecureCoding {}
               guard let idToken = response.idToken,
                     let refreshToken = response.refreshToken,
                     let providerID = response.providerID else {
-                fatalError("Internal Auth Error: missing token in EmailLinkSignInResponse")
+                fatalError("Internal Auth Error: missing token in VerifyAssertionResponse")
               }
               let additionalUserInfo = AdditionalUserInfo(providerID: providerID,
                                                           profile: response.profile,
                                                           username: response.username,
                                                           isNewUser: response.isNewUser)
               let updatedOAuthCredential = OAuthCredential(withVerifyAssertionResponse: response)
+              try await self.updateTokenAndRefreshUser(
+                idToken: idToken,
+                refreshToken: refreshToken,
+                expirationDate: response.approximateExpirationDate,
+                requestConfiguration: requestConfiguration
+              )
               let result = AuthDataResult(withUser: self, additionalUserInfo: additionalUserInfo,
                                           credential: updatedOAuthCredential)
-              self.updateTokenAndRefreshUser(idToken: idToken,
-                                             refreshToken: refreshToken,
-                                             accessToken: accessToken,
-                                             expirationDate: response.approximateExpirationDate,
-                                             result: result,
-                                             requestConfiguration: requestConfiguration,
-                                             completion: completion,
-                                             withTaskComplete: complete)
+              completeWithError(result, nil)
             } catch {
               self.signOutIfTokenIsInvalid(withError: error)
               completeWithError(nil, error)
@@ -1264,18 +1263,12 @@ extension User: NSSecureCoding {}
       if self.email != nil {
         if !hadEmailPasswordCredential {
           // The list of providers need to be updated for the newly added email-password provider.
-          self.internalGetToken { accessToken, error in
-            if let error {
-              callback(error)
-              return
-            }
-            guard let accessToken else {
-              fatalError("Auth Internal Error: Both accessToken and error are nil")
-            }
-            if let requestConfiguration = self.auth?.requestConfiguration {
-              let getAccountInfoRequest = GetAccountInfoRequest(accessToken: accessToken,
-                                                                requestConfiguration: requestConfiguration)
-              Task {
+          Task {
+            do {
+              let accessToken = try await self.internalGetTokenAsync()
+              if let requestConfiguration = self.auth?.requestConfiguration {
+                let getAccountInfoRequest = GetAccountInfoRequest(accessToken: accessToken,
+                                                                  requestConfiguration: requestConfiguration)
                 do {
                   let accountInfoResponse = try await AuthBackend.call(with: getAccountInfoRequest)
                   if let users = accountInfoResponse.users {
@@ -1306,6 +1299,8 @@ extension User: NSSecureCoding {}
                   callback(error)
                 }
               }
+            } catch {
+              callback(error)
             }
           }
           return
@@ -1337,18 +1332,14 @@ extension User: NSSecureCoding {}
         guard let user else {
           fatalError("Internal error: Both user and error are nil")
         }
-        self.internalGetToken { accessToken, error in
-          if let error {
-            complete()
-            callback(error)
-            return
-          }
-          if let configuration = self.auth?.requestConfiguration {
-            // Mutate setAccountInfoRequest in block
-            let setAccountInfoRequest = SetAccountInfoRequest(requestConfiguration: configuration)
-            setAccountInfoRequest.accessToken = accessToken
-            changeBlock(user, setAccountInfoRequest)
-            Task {
+        Task {
+          do {
+            let accessToken = try await self.internalGetTokenAsync()
+            if let configuration = self.auth?.requestConfiguration {
+              // Mutate setAccountInfoRequest in block
+              let setAccountInfoRequest = SetAccountInfoRequest(requestConfiguration: configuration)
+              setAccountInfoRequest.accessToken = accessToken
+              changeBlock(user, setAccountInfoRequest)
               do {
                 let accountInfoResponse = try await AuthBackend.call(with: setAccountInfoRequest)
                 if let idToken = accountInfoResponse.idToken,
@@ -1373,6 +1364,9 @@ extension User: NSSecureCoding {}
                 callback(error)
               }
             }
+          } catch {
+            complete()
+            callback(error)
           }
         }
       }
@@ -1512,6 +1506,7 @@ extension User: NSSecureCoding {}
                     let refreshToken = verifyResponse.refreshToken else {
                 fatalError("Internal Auth Error: missing token in internalUpdateOrLinkPhoneNumber")
               }
+              // Update the new token and refresh user info again.
               self.tokenService = SecureTokenService(
                 withRequestConfiguration: configuration,
                 accessToken: idToken,
@@ -1572,49 +1567,17 @@ extension User: NSSecureCoding {}
             fatalError("Internal auth error: Invalid SignUpNewUserResponse")
           }
           // Update the new token and refresh user info again.
-          self.tokenService = SecureTokenService(
-            withRequestConfiguration: self.requestConfiguration,
-            accessToken: idToken,
-            accessTokenExpirationDate: response.approximateExpirationDate,
-            refreshToken: refreshToken
+          try await self.updateTokenAndRefreshUser(
+            idToken: idToken,
+            refreshToken: refreshToken,
+            expirationDate: response.approximateExpirationDate,
+            requestConfiguration: requestConfiguration
+          )
+          User.callInMainThreadWithAuthDataResultAndError(
+            callback: completion,
+            result: AuthDataResult(withUser: self, additionalUserInfo: nil),
+            error: nil
           )
-
-          self.internalGetToken { accessToken, error in
-            if let error {
-              User.callInMainThreadWithAuthDataResultAndError(callback: completion,
-                                                              complete: nil, result: nil,
-                                                              error: error)
-              return
-            }
-            guard let accessToken else {
-              fatalError("Internal Auth Error: nil accessToken")
-            }
-            let getAccountInfoRequest = GetAccountInfoRequest(
-              accessToken: accessToken,
-              requestConfiguration: self.requestConfiguration
-            )
-            Task {
-              do {
-                let response = try await AuthBackend.call(with: getAccountInfoRequest)
-                self.isAnonymous = false
-                self.update(withGetAccountInfoResponse: response)
-                if let keychainError = self.updateKeychain() {
-                  User.callInMainThreadWithAuthDataResultAndError(callback: completion,
-                                                                  complete: nil, result: nil,
-                                                                  error: keychainError)
-                  return
-                }
-                User.callInMainThreadWithAuthDataResultAndError(callback: completion,
-                                                                complete: nil,
-                                                                result: authResult)
-              } catch {
-                self.signOutIfTokenIsInvalid(withError: error)
-                User.callInMainThreadWithAuthDataResultAndError(callback: completion,
-                                                                complete: nil, result: nil,
-                                                                error: error)
-              }
-            }
-          }
         } catch {
           self.signOutIfTokenIsInvalid(withError: error)
           User.callInMainThreadWithAuthDataResultAndError(callback: completion,
@@ -1663,16 +1626,17 @@ extension User: NSSecureCoding {}
                   let refreshToken = response.refreshToken else {
               fatalError("Internal Auth Error: missing token in EmailLinkSignInResponse")
             }
-            self.updateTokenAndRefreshUser(idToken: idToken,
-                                           refreshToken: refreshToken,
-                                           accessToken: accessToken,
-                                           expirationDate: response.approximateExpirationDate,
-                                           result: AuthDataResult(
-                                             withUser: self,
-                                             additionalUserInfo: nil
-                                           ),
-                                           requestConfiguration: requestConfiguration,
-                                           completion: completion)
+            try await self.updateTokenAndRefreshUser(
+              idToken: idToken,
+              refreshToken: refreshToken,
+              expirationDate: response.approximateExpirationDate,
+              requestConfiguration: requestConfiguration
+            )
+            User.callInMainThreadWithAuthDataResultAndError(
+              callback: completion,
+              result: AuthDataResult(withUser: self, additionalUserInfo: nil),
+              error: nil
+            )
           } catch {
             User.callInMainThreadWithAuthDataResultAndError(callback: completion,
                                                             result: nil,
@@ -1710,16 +1674,17 @@ extension User: NSSecureCoding {}
                   let refreshToken = response.refreshToken else {
               fatalError("Internal Auth Error: missing token in link(withGameCredential")
             }
-            self.updateTokenAndRefreshUser(idToken: idToken,
-                                           refreshToken: refreshToken,
-                                           accessToken: accessToken,
-                                           expirationDate: response.approximateExpirationDate,
-                                           result: AuthDataResult(
-                                             withUser: self,
-                                             additionalUserInfo: nil
-                                           ),
-                                           requestConfiguration: requestConfiguration,
-                                           completion: completion)
+            try await self.updateTokenAndRefreshUser(
+              idToken: idToken,
+              refreshToken: refreshToken,
+              expirationDate: response.approximateExpirationDate,
+              requestConfiguration: requestConfiguration
+            )
+            User.callInMainThreadWithAuthDataResultAndError(
+              callback: completion,
+              result: AuthDataResult(withUser: self, additionalUserInfo: nil),
+              error: nil
+            )
           } catch {
             User.callInMainThreadWithAuthDataResultAndError(callback: completion,
                                                             result: nil,
@@ -1754,52 +1719,29 @@ extension User: NSSecureCoding {}
   #endif
 
   // Update the new token and refresh user info again.
-  private func updateTokenAndRefreshUser(idToken: String, refreshToken: String,
-                                         accessToken: String?,
+  private func updateTokenAndRefreshUser(idToken: String,
+                                         refreshToken: String,
                                          expirationDate: Date?,
-                                         result: AuthDataResult,
-                                         requestConfiguration: AuthRequestConfiguration,
-                                         completion: ((AuthDataResult?, Error?) -> Void)?,
-                                         withTaskComplete complete: AuthSerialTaskCompletionBlock? =
-                                           nil) {
+                                         requestConfiguration: AuthRequestConfiguration) async throws {
     tokenService = SecureTokenService(
       withRequestConfiguration: requestConfiguration,
       accessToken: idToken,
       accessTokenExpirationDate: expirationDate,
       refreshToken: refreshToken
     )
-    internalGetToken { response, error in
-      if let error {
-        User.callInMainThreadWithAuthDataResultAndError(callback: completion,
-                                                        complete: complete,
-                                                        error: error)
-        return
-      }
-      guard let accessToken else {
-        fatalError("Internal Auth Error: nil access Token")
-      }
-      let getAccountInfoRequest = GetAccountInfoRequest(accessToken: accessToken,
-                                                        requestConfiguration: requestConfiguration)
-      Task {
-        do {
-          let response = try await AuthBackend.call(with: getAccountInfoRequest)
-          self.isAnonymous = false
-          self.update(withGetAccountInfoResponse: response)
-          if let error = self.updateKeychain() {
-            User.callInMainThreadWithAuthDataResultAndError(
-              callback: completion,
-              complete: complete,
-              error: error
-            )
-            return
-          }
-          User.callInMainThreadWithAuthDataResultAndError(callback: completion, complete: complete,
-                                                          result: result)
-        } catch {
-          self.signOutIfTokenIsInvalid(withError: error)
-          User.callInMainThreadWithAuthDataResultAndError(callback: completion, error: error)
-        }
-      }
+    let accessToken = try await internalGetTokenAsync()
+    let getAccountInfoRequest = GetAccountInfoRequest(accessToken: accessToken,
+                                                      requestConfiguration: requestConfiguration)
+    do {
+      let response = try await AuthBackend.call(with: getAccountInfoRequest)
+      isAnonymous = false
+      update(withGetAccountInfoResponse: response)
+    } catch {
+      signOutIfTokenIsInvalid(withError: error)
+      throw error
+    }
+    if let error = updateKeychain() {
+      throw error
     }
   }