signInWithAppleOnApple method

Future<User> signInWithAppleOnApple()

Implementation

Future<User> signInWithAppleOnApple() async {
  final rawNonce = generateNonce();
  final nonce = sha256ofString(rawNonce);

  final appleCredential = await SignInWithApple.getAppleIDCredential(
    scopes: [
      AppleIDAuthorizationScopes.email,
      AppleIDAuthorizationScopes.fullName,
    ],
    nonce: nonce,
  );

  final oauthCredential = OAuthProvider('apple.com').credential(
    idToken: appleCredential.identityToken,
    rawNonce: rawNonce,
  );

  final UserCredential userCredential =
      await FirebaseAuth.instance.signInWithCredential(oauthCredential);

  if (userCredential.user?.displayName == null ||
      (userCredential.user?.displayName != null &&
          userCredential.user!.displayName!.isEmpty)) {
    final fixDisplayNameFromApple = [
      appleCredential.givenName ?? '',
      appleCredential.familyName ?? '',
    ].join(' ').trim();
    await userCredential.user?.updateDisplayName(fixDisplayNameFromApple);
  }
  if (userCredential.user?.email == null ||
      (userCredential.user?.email != null &&
          userCredential.user!.email!.isEmpty)) {
    await userCredential.user?.updateEmail(appleCredential.email ?? '');
  }

  if (_firebaseAuth.currentUser != null) return _firebaseAuth.currentUser!;
  throw Exception('_firebaseAuth.currentUser is null');
}