@@ -63,7 +63,7 @@ actor AuthWorker {
63
63
guard let currentUser = auth. currentUser else {
64
64
return nil
65
65
}
66
- return try await currentUser. internalGetTokenAsync ( forceRefresh: forceRefresh)
66
+ return try await currentUser. internalGetToken ( forceRefresh: forceRefresh)
67
67
}
68
68
69
69
/// Only for testing
@@ -342,7 +342,7 @@ actor AuthWorker {
342
342
return
343
343
}
344
344
// The list of providers need to be updated for the newly added email-password provider.
345
- let accessToken = try await user. internalGetTokenAsync ( )
345
+ let accessToken = try await user. internalGetToken ( )
346
346
let getAccountInfoRequest = GetAccountInfoRequest ( accessToken: accessToken,
347
347
requestConfiguration: requestConfiguration)
348
348
do {
@@ -386,7 +386,7 @@ actor AuthWorker {
386
386
/// operation.
387
387
func updateOrLinkPhoneNumber( user: User , credential: PhoneAuthCredential ,
388
388
isLinkOperation: Bool ) async throws {
389
- let accessToken = try await user. internalGetTokenAsync ( )
389
+ let accessToken = try await user. internalGetToken ( )
390
390
391
391
guard let configuration = user. auth? . requestConfiguration else {
392
392
fatalError ( " Auth Internal Error: nil value for VerifyPhoneNumberRequest initializer " )
@@ -436,7 +436,7 @@ actor AuthWorker {
436
436
SetAccountInfoRequest )
437
437
-> Void ) async throws {
438
438
let userAccountInfo = try await getAccountInfoRefreshingCache ( user)
439
- let accessToken = try await user. internalGetTokenAsync ( )
439
+ let accessToken = try await user. internalGetToken ( )
440
440
441
441
// Mutate setAccountInfoRequest in block
442
442
let setAccountInfoRequest = SetAccountInfoRequest ( requestConfiguration: requestConfiguration)
@@ -465,7 +465,7 @@ actor AuthWorker {
465
465
/// error has been detected. Invoked asynchronously on the auth global work queue in the future.
466
466
func getAccountInfoRefreshingCache( _ user: User ) async throws
467
467
-> GetAccountInfoResponseUser {
468
- let token = try await user. internalGetTokenAsync ( )
468
+ let token = try await user. internalGetToken ( )
469
469
let request = GetAccountInfoRequest ( accessToken: token,
470
470
requestConfiguration: requestConfiguration)
471
471
do {
@@ -511,7 +511,7 @@ actor AuthWorker {
511
511
512
512
func getIDTokenResult( user: User ,
513
513
forcingRefresh forceRefresh: Bool ) async throws -> AuthTokenResult {
514
- let token = try await user. internalGetTokenAsync ( forceRefresh: forceRefresh)
514
+ let token = try await user. internalGetToken ( forceRefresh: forceRefresh)
515
515
let tokenResult = try AuthTokenResult . tokenResult ( token: token)
516
516
AuthLog . logDebug ( code: " I-AUT000017 " , message: " Actual token expiration date: " +
517
517
" \( String ( describing: tokenResult. expirationDate) ) , " +
@@ -537,7 +537,7 @@ actor AuthWorker {
537
537
}
538
538
#endif
539
539
540
- let accessToken = try await user. internalGetTokenAsync ( )
540
+ let accessToken = try await user. internalGetToken ( )
541
541
let request = VerifyAssertionRequest ( providerID: credential. provider,
542
542
requestConfiguration: requestConfiguration)
543
543
credential. prepare ( request)
@@ -572,6 +572,131 @@ actor AuthWorker {
572
572
return try await link ( user: user, with: credential)
573
573
}
574
574
575
+ func unlink( user: User , fromProvider provider: String ) async throws -> User {
576
+ let accessToken = try await user. internalGetToken ( )
577
+ let request = SetAccountInfoRequest ( requestConfiguration: requestConfiguration)
578
+ request. accessToken = accessToken
579
+
580
+ if user. providerDataRaw [ provider] == nil {
581
+ throw AuthErrorUtils . noSuchProviderError ( )
582
+ }
583
+ request. deleteProviders = [ provider]
584
+ do {
585
+ let response = try await AuthBackend . call ( with: request)
586
+
587
+ // We can't just use the provider info objects in SetAccountInfoResponse
588
+ // because they don't have localID and email fields. Remove the specific
589
+ // provider manually.
590
+ user. providerDataRaw. removeValue ( forKey: provider)
591
+
592
+ if provider == EmailAuthProvider . id {
593
+ user. hasEmailPasswordCredential = false
594
+ }
595
+ #if os(iOS)
596
+ // After successfully unlinking a phone auth provider, remove the phone number
597
+ // from the cached user info.
598
+ if provider == PhoneAuthProvider . id {
599
+ user. phoneNumber = nil
600
+ }
601
+ #endif
602
+ if let idToken = response. idToken,
603
+ let refreshToken = response. refreshToken {
604
+ let tokenService = SecureTokenService (
605
+ withRequestConfiguration: requestConfiguration,
606
+ accessToken: idToken,
607
+ accessTokenExpirationDate: response. approximateExpirationDate,
608
+ refreshToken: refreshToken
609
+ )
610
+ try await user. setTokenService ( tokenService: tokenService)
611
+ return user
612
+ }
613
+ } catch {
614
+ user. signOutIfTokenIsInvalid ( withError: error)
615
+ throw error
616
+ }
617
+
618
+ if let error = user. updateKeychain ( ) {
619
+ throw error
620
+ }
621
+ return user
622
+ }
623
+
624
+ func sendEmailVerification( user: User ,
625
+ with actionCodeSettings: ActionCodeSettings ? ) async throws {
626
+ let accessToken = try await user. internalGetToken ( )
627
+ let request = GetOOBConfirmationCodeRequest . verifyEmailRequest (
628
+ accessToken: accessToken,
629
+ actionCodeSettings: actionCodeSettings,
630
+ requestConfiguration: requestConfiguration
631
+ )
632
+ do {
633
+ _ = try await AuthBackend . call ( with: request)
634
+ } catch {
635
+ user. signOutIfTokenIsInvalid ( withError: error)
636
+ throw error
637
+ }
638
+ }
639
+
640
+ func sendEmailVerification( user: User ,
641
+ beforeUpdatingEmail newEmail: String ,
642
+ actionCodeSettings: ActionCodeSettings ? ) async throws {
643
+ let accessToken = try await user. internalGetToken ( )
644
+ let request = GetOOBConfirmationCodeRequest . verifyBeforeUpdateEmail (
645
+ accessToken: accessToken,
646
+ newEmail: newEmail,
647
+ actionCodeSettings: actionCodeSettings,
648
+ requestConfiguration: requestConfiguration
649
+ )
650
+ do {
651
+ _ = try await AuthBackend . call ( with: request)
652
+ } catch {
653
+ user. signOutIfTokenIsInvalid ( withError: error)
654
+ throw error
655
+ }
656
+ }
657
+
658
+ func delete( user: User ) async throws {
659
+ let accessToken = try await user. internalGetToken ( )
660
+ let request = DeleteAccountRequest ( localID: user. uid, accessToken: accessToken,
661
+ requestConfiguration: requestConfiguration)
662
+ _ = try await AuthBackend . call ( with: request)
663
+ try user. auth? . signOutByForce ( withUserID: user. uid)
664
+ }
665
+
666
+ func commitChanges( changeRequest: UserProfileChangeRequest ) async throws {
667
+ if changeRequest. consumed {
668
+ fatalError ( " Internal Auth Error: commitChanges should only be called once. " )
669
+ }
670
+ changeRequest. consumed = true
671
+
672
+ // Return fast if there is nothing to update:
673
+ if !changeRequest. photoURLWasSet, !changeRequest. displayNameWasSet {
674
+ return
675
+ }
676
+ let displayName = changeRequest. displayName
677
+ let displayNameWasSet = changeRequest. displayNameWasSet
678
+ let photoURL = changeRequest. photoURL
679
+ let photoURLWasSet = changeRequest. photoURLWasSet
680
+
681
+ try await executeUserUpdateWithChanges ( user: changeRequest. user) { _, request in
682
+ if photoURLWasSet {
683
+ request. photoURL = photoURL
684
+ }
685
+ if displayNameWasSet {
686
+ request. displayName = displayName
687
+ }
688
+ }
689
+ if displayNameWasSet {
690
+ changeRequest. user. displayName = displayName
691
+ }
692
+ if photoURLWasSet {
693
+ changeRequest. user. photoURL = photoURL
694
+ }
695
+ if let error = changeRequest. user. updateKeychain ( ) {
696
+ throw error
697
+ }
698
+ }
699
+
575
700
private func link( user: User ,
576
701
withEmailCredential emailCredential: EmailAuthCredential ) async throws
577
702
-> AuthDataResult {
@@ -588,7 +713,7 @@ actor AuthWorker {
588
713
authResult: result
589
714
)
590
715
case let . link( link) :
591
- let accessToken = try ? await user. internalGetTokenAsync ( )
716
+ let accessToken = try ? await user. internalGetToken ( )
592
717
var queryItems = AuthWebUtils . parseURL ( link)
593
718
if link. count == 0 {
594
719
if let urlComponents = URLComponents ( string: link) ,
@@ -622,7 +747,7 @@ actor AuthWorker {
622
747
withEmail email: String ,
623
748
password: String ,
624
749
authResult: AuthDataResult ) async throws -> AuthDataResult {
625
- let accessToken = try await user. internalGetTokenAsync ( )
750
+ let accessToken = try await user. internalGetToken ( )
626
751
do {
627
752
let request = SignUpNewUserRequest ( email: email,
628
753
password: password,
@@ -647,7 +772,7 @@ actor AuthWorker {
647
772
refreshToken: refreshToken
648
773
)
649
774
650
- let accessToken = try await user. internalGetTokenAsync ( )
775
+ let accessToken = try await user. internalGetToken ( )
651
776
let getAccountInfoRequest = GetAccountInfoRequest (
652
777
accessToken: accessToken,
653
778
requestConfiguration: requestConfiguration
@@ -670,7 +795,7 @@ actor AuthWorker {
670
795
private func link( user: User ,
671
796
withGameCenterCredential gameCenterCredential: GameCenterAuthCredential ) async throws
672
797
-> AuthDataResult {
673
- let accessToken = try await user. internalGetTokenAsync ( )
798
+ let accessToken = try await user. internalGetToken ( )
674
799
guard let publicKeyURL = gameCenterCredential. publicKeyURL,
675
800
let signature = gameCenterCredential. signature,
676
801
let salt = gameCenterCredential. salt else {
@@ -721,7 +846,7 @@ actor AuthWorker {
721
846
accessTokenExpirationDate: expirationDate,
722
847
refreshToken: refreshToken
723
848
)
724
- let accessToken = try await user. internalGetTokenAsync ( )
849
+ let accessToken = try await user. internalGetToken ( )
725
850
let getAccountInfoRequest = GetAccountInfoRequest ( accessToken: accessToken,
726
851
requestConfiguration: requestConfiguration)
727
852
do {
@@ -821,7 +946,7 @@ actor AuthWorker {
821
946
}
822
947
let uid = currentUser. uid
823
948
do {
824
- _ = try await currentUser. internalGetTokenAsync ( forceRefresh: true )
949
+ _ = try await currentUser. internalGetToken ( forceRefresh: true )
825
950
if auth. currentUser? . uid != uid {
826
951
return
827
952
}
0 commit comments