image

19 Dec 2025

9K

35K

Flutter & Firebase Auth: Seamless Social Media Login

In today's digital landscape, user authentication is a critical component of almost every application. Providing a smooth and familiar login experience can significantly boost user adoption and satisfaction. Social media logins, leveraging existing user accounts from platforms like Google, Facebook, or Twitter, offer a convenient alternative to traditional email/password registration. This article explores how to integrate social media authentication into a Flutter application using Firebase Authentication, focusing on a robust and scalable solution.

Why Firebase Authentication for Social Logins?

Firebase Authentication provides a comprehensive, secure, and easy-to-implement solution for managing user authentication. Its key advantages include:

  • Multiple Providers: Supports various authentication methods, including email/password, phone, and popular social providers (Google, Facebook, Twitter, Apple, GitHub, etc.).
  • Ease of Integration: Simplifies backend development by handling user registration, login, and account management securely.
  • Security: Firebase handles user data storage and security best practices, reducing the burden on developers.
  • Scalability: Designed to scale seamlessly from small projects to large-scale applications.
  • Cross-Platform: Works perfectly with Flutter, enabling a single codebase for both Android and iOS.

Prerequisites

Before diving into the implementation, ensure you have the following:

  1. Flutter SDK: Installed and configured on your development machine.
  2. Firebase Project: A new or existing Firebase project set up in the Firebase Console.
  3. Firebase Configuration Files: google-services.json (for Android) and GoogleService-Info.plist (for iOS) added to your Flutter project.
  4. Authentication Method Enabled: In your Firebase project, navigate to "Authentication" > "Sign-in method" and enable the social provider(s) you intend to use (e.g., Google, Facebook).

Step 1: Firebase Project Setup and Provider Enablement

For each social login provider, specific configurations are required within the Firebase Console and potentially the provider's developer console.

Google Sign-In

In the Firebase Console:

  1. Go to "Authentication" > "Sign-in method" and enable "Google".
  2. You'll be prompted to select a project support email.
  3. For Android, ensure your SHA-1 fingerprint is added to your Android app's settings in Firebase. This is crucial for Google Sign-In to work.
  4. For iOS, ensure your Bundle ID is correctly configured in your iOS app's settings in Firebase.

Step 2: Flutter Project Configuration

First, add the necessary Firebase and Google Sign-In packages to your pubspec.yaml file:


dependencies:
  flutter:
    sdk: flutter
  
  firebase_core: ^2.24.2 # Use the latest stable version
  firebase_auth: ^4.15.2 # Use the latest stable version
  google_sign_in: ^6.1.6 # Use the latest stable version
  # Add other social providers like facebook_auth if needed

Run flutter pub get to fetch the new dependencies.

Next, initialize Firebase in your main.dart file. This should be done before running your app, typically in the main() function.


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

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp(); // Initialize Firebase
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Firebase Auth Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: const AuthScreen(), // Your initial screen for authentication
    );
  }
}

Step 3: Implementing Google Sign-In Logic

Let's create a dedicated service or a method within your authentication screen to handle the Google Sign-In process.


import 'package:firebase_auth/firebase_auth.dart';
import 'package:google_sign_in/google_sign_in.dart';
import 'package:flutter/material.dart'; // For context and snackbar

class AuthService {
  final FirebaseAuth _auth = FirebaseAuth.instance;
  final GoogleSignIn _googleSignIn = GoogleSignIn();

  Future<User?> signInWithGoogle(BuildContext context) async {
    try {
      // Begin interactive sign in process
      final GoogleSignInAccount? googleSignInAccount = await _googleSignIn.signIn();

      if (googleSignInAccount != null) {
        final GoogleSignInAuthentication googleSignInAuthentication =
            await googleSignInAccount.authentication;

        final AuthCredential credential = GoogleAuthProvider.credential(
          accessToken: googleSignInAuthentication.accessToken,
          idToken: googleSignInAuthentication.idToken,
        );

        // Sign in to Firebase with the Google [AuthCredential].
        final UserCredential userCredential = await _auth.signInWithCredential(credential);
        return userCredential.user;
      }
      return null; // User cancelled the sign-in
    } on FirebaseAuthException catch (e) {
      if (context.mounted) {
        ScaffoldMessenger.of(context).showSnackBar(
          SnackBar(content: Text('Firebase Auth Error: ${e.message}')),
        );
      }
      print('Firebase Auth Error: ${e.code} - ${e.message}');
      return null;
    } catch (e) {
      if (context.mounted) {
        ScaffoldMessenger.of(context).showSnackBar(
          SnackBar(content: Text('Error during Google Sign-In: $e')),
        );
      }
      print('Error during Google Sign-In: $e');
      return null;
    }
  }

  Future<void> signOutGoogle() async {
    await _googleSignIn.signOut();
    await _auth.signOut();
  }

  Stream<User?> get authStateChanges => _auth.authStateChanges();
}

Building the UI for Login

Now, let's create a simple UI to trigger the Google Sign-In flow.


import 'package:flutter/material.dart';
import 'package:firebase_auth/firebase_auth.dart'; // To listen to auth state
import 'package:flutter_firebase_auth_demo/auth_service.dart'; // Assuming AuthService is in this file

class AuthScreen extends StatefulWidget {
  const AuthScreen({super.key});

  @override
  State<AuthScreen> createState() => _AuthScreenState();
}

class _AuthScreenState extends State<AuthScreen> {
  @override
  Widget build(BuildContext context) {
    return StreamBuilder<User?>(
      stream: AuthService().authStateChanges,
      builder: (context, snapshot) {
        if (snapshot.connectionState == ConnectionState.active) {
          User? user = snapshot.data;
          if (user == null) {
            // No user is signed in, show login UI
            return Scaffold(
              appBar: AppBar(title: const Text('Login')),
              body: Center(
                child: Column(
                  mainAxisAlignment: MainAxisAlignment.center,
                  children: [
                    const Text('Sign in to continue'),
                    const SizedBox(height: 20),
                    ElevatedButton.icon(
                      onPressed: () async {
                        User? firebaseUser = await AuthService().signInWithGoogle(context);
                        if (firebaseUser != null) {
                          // Handle successful login (e.g., navigate to home screen)
                          print('User logged in: ${firebaseUser.displayName}');
                        } else {
                          // Login failed or cancelled
                          print('Google Sign-In failed or was cancelled.');
                        }
                      },
                      icon: Image.asset(
                        'assets/google_logo.png', // Add a Google logo image to your assets
                        height: 24.0,
                        width: 24.0,
                      ),
                      label: const Text('Sign in with Google'),
                      style: ElevatedButton.styleFrom(
                        foregroundColor: Colors.black, backgroundColor: Colors.white,
                        minimumSize: const Size(200, 50),
                        shape: RoundedRectangleBorder(
                          borderRadius: BorderRadius.circular(30.0),
                        ),
                      ),
                    ),
                    // Add other social login buttons here
                  ],
                ),
              ),
            );
          } else {
            // User is signed in, show home screen or user info
            return HomeScreen(user: user);
          }
        }
        // Show loading indicator while checking auth state
        return const Scaffold(
          body: Center(
            child: CircularProgressIndicator(),
          ),
        );
      },
    );
  }
}

class HomeScreen extends StatelessWidget {
  final User user;
  const HomeScreen({super.key, required this.user});

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Home Screen'),
        actions: [
          IconButton(
            icon: const Icon(Icons.logout),
            onPressed: () async {
              await AuthService().signOutGoogle();
            },
          ),
        ],
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            Text('Welcome, ${user.displayName ?? "User"}!'),
            Text('Email: ${user.email ?? "N/A"}'),
            if (user.photoURL != null)
              Padding(
                padding: const EdgeInsets.all(8.0),
                child: CircleAvatar(
                  radius: 40,
                  backgroundImage: NetworkImage(user.photoURL!),
                ),
              ),
            const SizedBox(height: 20),
            ElevatedButton(
              onPressed: () async {
                await AuthService().signOutGoogle();
              },
              child: const Text('Sign Out'),
            ),
          ],
        ),
      ),
    );
  }
}

Remember to add a Google logo image (e.g., google_logo.png) to your assets/ folder and declare it in pubspec.yaml:


flutter:
  uses-material-design: true
  assets:
    - assets/google_logo.png

Step 4: Handling User State and Navigation

The AuthService().authStateChanges stream is a powerful way to listen for real-time changes in the user's authentication state. This allows your app to automatically navigate between login and home screens when a user signs in or out, providing a responsive and dynamic user experience.

As shown in the AuthScreen example, a StreamBuilder widget can observe this stream and conditionally render different parts of your UI based on whether a user is logged in or not.

Conclusion

Integrating social media login into your Flutter application with Firebase Authentication is a streamlined and efficient process. By leveraging Firebase's robust backend and Flutter's expressive UI, developers can provide a secure, convenient, and user-friendly authentication experience. The methods outlined above for Google Sign-In can be extended to other social providers with similar ease, making Firebase Auth an invaluable tool for modern mobile application development.

Related Articles

Dec 19, 2025

Flutter & Firebase Auth: Seamless Social Media Login

Flutter & Firebase Auth: Seamless Social Media Login In today's digital landscape, user authentication is a critical component of almost every application. Pro

Dec 19, 2025

Building a Widget List with Sticky

Building a Widget List with Sticky Header in Flutter Creating dynamic and engaging user interfaces is crucial for modern applications. One common UI pattern th

Dec 19, 2025

Mastering Transform Scale & Rotate Animations in Flutter

Mastering Transform Scale & Rotate Animations in Flutter Flutter's powerful animation framework allows developers to create visually stunning and highly intera