From c4350c77bed81696dbd7503b4a38fc71a7335f36 Mon Sep 17 00:00:00 2001 From: Robin Genz Date: Sun, 28 Aug 2022 19:01:09 +0200 Subject: [PATCH] fix(authentication):`displayName` is missing when signing in with Apple on iOS using `skipNativeAuth` (#192) --- .changeset/dull-steaks-count.md | 5 +++++ .../ios/Plugin/FirebaseAuthentication.swift | 9 +++++++-- .../ios/Plugin/FirebaseAuthenticationHelper.swift | 12 ++++++++++-- .../Plugin/Handlers/AppleAuthProviderHandler.swift | 8 +++++++- 4 files changed, 29 insertions(+), 5 deletions(-) create mode 100644 .changeset/dull-steaks-count.md diff --git a/.changeset/dull-steaks-count.md b/.changeset/dull-steaks-count.md new file mode 100644 index 00000000..f827e4db --- /dev/null +++ b/.changeset/dull-steaks-count.md @@ -0,0 +1,5 @@ +--- +"@capacitor-firebase/authentication": patch +--- + +fix(ios): `displayName` is missing when signing in with Apple using `skipNativeAuth` diff --git a/packages/authentication/ios/Plugin/FirebaseAuthentication.swift b/packages/authentication/ios/Plugin/FirebaseAuthentication.swift index 56bebb81..cb80b6fd 100644 --- a/packages/authentication/ios/Plugin/FirebaseAuthentication.swift +++ b/packages/authentication/ios/Plugin/FirebaseAuthentication.swift @@ -262,11 +262,16 @@ public typealias AuthStateChangedObserver = () -> Void } func handleSuccessfulSignIn(credential: AuthCredential, idToken: String?, nonce: String?, accessToken: String?) { + self.handleSuccessfulSignIn(credential: credential, idToken: idToken, nonce: nonce, accessToken: accessToken, displayName: nil) + } + + func handleSuccessfulSignIn(credential: AuthCredential, idToken: String?, nonce: String?, accessToken: String?, displayName: String?) { if config.skipNativeAuth == true { guard let savedCall = self.savedCall else { return } - let result = FirebaseAuthenticationHelper.createSignInResult(credential: credential, user: nil, idToken: idToken, nonce: nonce, accessToken: accessToken, additionalUserInfo: nil) + let result = FirebaseAuthenticationHelper.createSignInResult(credential: credential, user: nil, idToken: idToken, nonce: nonce, + accessToken: accessToken, additionalUserInfo: nil, displayName: displayName) savedCall.resolve(result) return } @@ -279,7 +284,7 @@ public typealias AuthStateChangedObserver = () -> Void return } let result = FirebaseAuthenticationHelper.createSignInResult(credential: authResult?.credential, user: authResult?.user, idToken: idToken, nonce: nonce, accessToken: accessToken, - additionalUserInfo: authResult?.additionalUserInfo) + additionalUserInfo: authResult?.additionalUserInfo, displayName: displayName) savedCall.resolve(result) } } diff --git a/packages/authentication/ios/Plugin/FirebaseAuthenticationHelper.swift b/packages/authentication/ios/Plugin/FirebaseAuthenticationHelper.swift index dfcc8b7e..b997e05f 100644 --- a/packages/authentication/ios/Plugin/FirebaseAuthenticationHelper.swift +++ b/packages/authentication/ios/Plugin/FirebaseAuthenticationHelper.swift @@ -5,7 +5,11 @@ import FirebaseAuth public class FirebaseAuthenticationHelper { public static func createSignInResult(credential: AuthCredential?, user: User?, idToken: String?, nonce: String?, accessToken: String?, additionalUserInfo: AdditionalUserInfo?) -> JSObject { - let userResult = self.createUserResult(user) + return createSignInResult(credential: credential, user: user, idToken: idToken, nonce: nonce, accessToken: accessToken, additionalUserInfo: additionalUserInfo, displayName: nil) + } + + public static func createSignInResult(credential: AuthCredential?, user: User?, idToken: String?, nonce: String?, accessToken: String?, additionalUserInfo: AdditionalUserInfo?, displayName: String?) -> JSObject { + let userResult = self.createUserResult(user, displayName: displayName) let credentialResult = self.createCredentialResult(credential, idToken: idToken, nonce: nonce, accessToken: accessToken) let additionalUserInfoResult = self.createAdditionalUserInfoResult(additionalUserInfo) var result = JSObject() @@ -16,11 +20,15 @@ public class FirebaseAuthenticationHelper { } public static func createUserResult(_ user: User?) -> JSObject? { + return createUserResult(user, displayName: nil) + } + + public static func createUserResult(_ user: User?, displayName: String?) -> JSObject? { guard let user = user else { return nil } var result = JSObject() - result["displayName"] = user.displayName + result["displayName"] = displayName ?? user.displayName result["email"] = user.email result["emailVerified"] = user.isEmailVerified result["isAnonymous"] = user.isAnonymous diff --git a/packages/authentication/ios/Plugin/Handlers/AppleAuthProviderHandler.swift b/packages/authentication/ios/Plugin/Handlers/AppleAuthProviderHandler.swift index cd4f889d..5ecbaf03 100644 --- a/packages/authentication/ios/Plugin/Handlers/AppleAuthProviderHandler.swift +++ b/packages/authentication/ios/Plugin/Handlers/AppleAuthProviderHandler.swift @@ -103,8 +103,14 @@ extension AppleAuthProviderHandler: ASAuthorizationControllerDelegate, ASAuthori print("Unable to serialize token string from data: \(appleIDToken.debugDescription)") return } + var displayName: String? + if let fullName = appleIDCredential.fullName { + if let givenName = fullName.givenName, let familyName = fullName.familyName { + displayName = "\(givenName) \(familyName)" + } + } let credential = OAuthProvider.credential(withProviderID: "apple.com", idToken: idTokenString, rawNonce: nonce) - self.pluginImplementation.handleSuccessfulSignIn(credential: credential, idToken: idTokenString, nonce: nonce, accessToken: nil) + self.pluginImplementation.handleSuccessfulSignIn(credential: credential, idToken: idTokenString, nonce: nonce, accessToken: nil, displayName: displayName) } func authorizationController(controller: ASAuthorizationController, didCompleteWithError error: Error) {