Android Sign in with Apple and Firebase Flutter

Introduction

This article provides a comprehensive guide on implementing Sign in with Apple functionality in your Android Flutter application using Firebase.

Prerequisites

  • Flutter development environment setup
  • Firebase project configured
  • Android development environment setup

Steps

1. Configure Firebase

  • Create a new Firebase project or use an existing one.
  • Enable Sign in with Apple in the Firebase console under Authentication > Sign-in method.
  • Download the GoogleService-Info.plist file and add it to your Android project.

2. Install Firebase Packages


dependencies:
  firebase_auth: ^3.3.10
  firebase_core: ^1.18.0
  flutter_sign_in_with_apple: ^2.1.1

3. Implement Sign in with Apple Logic


import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter_sign_in_with_apple/flutter_sign_in_with_apple.dart';

// Function to handle Apple sign-in
Future signInWithApple() async {
  // Request the user's Apple ID credentials
  final appleCredential = await SignInWithApple.getAppleIDCredential(
    scopes: [
      AppleIDAuthorizationScopes.email,
      AppleIDAuthorizationScopes.fullName,
    ],
  );

  // Create an OAuth credential from the Apple ID credentials
  final oauthCredential = OAuthCredential.credential(
    idToken: appleCredential.identityToken,
    accessToken: appleCredential.authorizationCode,
  );

  // Sign in to Firebase using the OAuth credential
  return await FirebaseAuth.instance.signInWithCredential(oauthCredential);
}

// Function to handle sign out
Future signOut() async {
  await FirebaseAuth.instance.signOut();
}

4. Create the Sign in UI


import 'package:flutter/material.dart';
import 'package:firebase_auth/firebase_auth.dart';

class SignInPage extends StatefulWidget {
  @override
  _SignInPageState createState() => _SignInPageState();
}

class _SignInPageState extends State {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Sign In'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            // Apple sign-in button
            SignInWithAppleButton(
              onPressed: () async {
                try {
                  final userCredential = await signInWithApple();
                  // Handle successful sign in
                } catch (e) {
                  // Handle errors
                }
              },
            ),
            SizedBox(height: 20),
            // Sign out button
            ElevatedButton(
              onPressed: () {
                signOut();
              },
              child: Text('Sign Out'),
            ),
          ],
        ),
      ),
    );
  }
}

Code Example

The following code demonstrates the complete implementation of Sign in with Apple in a Flutter Android app:


import 'package:flutter/material.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter_sign_in_with_apple/flutter_sign_in_with_apple.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Sign in with Apple',
      home: SignInPage(),
    );
  }
}

class SignInPage extends StatefulWidget {
  @override
  _SignInPageState createState() => _SignInPageState();
}

class _SignInPageState extends State {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Sign In'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            SignInWithAppleButton(
              onPressed: () async {
                try {
                  final userCredential = await signInWithApple();
                  // Handle successful sign in
                } catch (e) {
                  // Handle errors
                }
              },
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: () {
                signOut();
              },
              child: Text('Sign Out'),
            ),
          ],
        ),
      ),
    );
  }
}

Future signInWithApple() async {
  final appleCredential = await SignInWithApple.getAppleIDCredential(
    scopes: [
      AppleIDAuthorizationScopes.email,
      AppleIDAuthorizationScopes.fullName,
    ],
  );

  final oauthCredential = OAuthCredential.credential(
    idToken: appleCredential.identityToken,
    accessToken: appleCredential.authorizationCode,
  );

  return await FirebaseAuth.instance.signInWithCredential(oauthCredential);
}

Future signOut() async {
  await FirebaseAuth.instance.signOut();
}

Conclusion

By following these steps, you can successfully integrate Sign in with Apple into your Android Flutter application using Firebase, providing users with a convenient and secure authentication option.

Comparison Table

Feature Sign in with Apple Firebase
Authentication Method OAuth 2.0 Email/Password, Social Logins, Phone Number
Platform Support iOS, macOS, iPadOS, watchOS Web, iOS, Android, macOS
Data Storage Apple servers Firebase Realtime Database, Firestore, Cloud Storage
Security Strong encryption and authentication protocols Robust security features, including data encryption and access control


Leave a Reply

Your email address will not be published. Required fields are marked *