7 – Implementing Two-Factor Authentication (2FA) with Firebase

Implementing Two-Factor Authentication (2FA) with Firebase

Two-Factor Authentication (2FA) is a crucial security feature that adds an extra layer of protection to user accounts. With Firebase, you can easily implement 2FA to enhance the security of your applications. In this guide, we will explore the process of implementing 2FA with Firebase, including setting up and using this feature.

1. Prerequisites

Before you start implementing 2FA with Firebase, make sure you have the following prerequisites in place:

  • Firebase Project: Create a Firebase project if you don’t already have one. You can do this on the Firebase Console (https://console.firebase.google.com/).
  • Development Environment: Set up your development environment based on your target platform (web, Android, iOS).
2. Enabling 2FA in Firebase

To enable 2FA for your Firebase project, follow these steps:

  1. Go to the Firebase Console and select your project.
  2. In the left menu, navigate to “Authentication.”
  3. Click on the “Sign-in method” tab.
  4. Enable the “Phone” sign-in provider.

With this setting enabled, users will have the option to enable 2FA in their profile settings.

3. User Enrollment

Once 2FA is enabled, users can enroll their phone numbers for added security. This process usually involves sending a verification code via SMS to the user’s phone number. Users will be prompted to enter this code to complete enrollment. The Firebase SDK provides easy-to-use methods to facilitate this process:

For Web (HTML/JavaScript)

// Initialize Firebase
var config = {
    apiKey: "YOUR_API_KEY",
    authDomain: "YOUR_AUTH_DOMAIN",
    projectId: "YOUR_PROJECT_ID",
    storageBucket: "YOUR_STORAGE_BUCKET",
    messagingSenderId: "YOUR_MESSAGING_SENDER_ID",
    appId: "YOUR_APP_ID"
};

firebase.initializeApp(config);

// Enroll the user's phone number
var phoneNumber = "+1234567890"; // User's phone number
var appVerifier = new firebase.auth.RecaptchaVerifier('recaptcha-container'); // Recaptcha container
firebase.auth().signInWithPhoneNumber(phoneNumber, appVerifier)
    .then((confirmationResult) => {
        // SMS sent successfully
        var code = prompt('Enter the verification code:', '');
        return confirmationResult.confirm(code);
    })
    .then((user) => {
        // Phone number enrolled successfully
    })
    .catch((error) => {
        // Handle enrollment error
    });

This code initializes Firebase and uses the RecaptchaVerifier to send an SMS verification code to the user’s phone number for enrollment.

For Android

In an Android app, the process of enrolling a phone number for 2FA involves sending an SMS verification code. You can use Firebase’s built-in authentication flow for this:


// Initialize Firebase
FirebaseApp.initializeApp(this);

// Enroll the user's phone number
String phoneNumber = "+1234567890"; // User's phone number
PhoneAuthProvider.getInstance().verifyPhoneNumber(
        phoneNumber,
        60, // Timeout duration
        TimeUnit.SECONDS,
        this,
        new PhoneAuthProvider.OnVerificationStateChangedCallbacks() {
            @Override
            public void onCodeSent(String verificationId, PhoneAuthProvider.ForceResendingToken forceResendingToken) {
                // Verification code sent successfully
                String code = "123456"; // The code entered by the user
                PhoneAuthCredential credential = PhoneAuthProvider.getCredential(verificationId, code);
                FirebaseAuth.getInstance().signInWithCredential(credential)
                        .addOnCompleteListener(task -> {
                            if (task.isSuccessful()) {
                                // Phone number enrolled successfully
                            } else {
                                // Handle enrollment error
                            }
                        });
            }
        });

This Android code demonstrates how to send an SMS verification code and enroll the user’s phone number for 2FA.

For iOS

In an iOS app, you can implement 2FA enrollment by leveraging Firebase’s authentication features:


// Initialize Firebase
FirebaseApp.configure()

// Enroll the user's phone number
let phoneNumber = "+1234567890" // User's phone number
PhoneAuthProvider.provider().verifyPhoneNumber(
    phoneNumber,
    uiDelegate: nil,
    multiFactorSession: nil
) { verificationID, error in
    if error == nil {
        // Verification code sent successfully
        let verificationCode = "123456" // The code entered by the user
        let credential = PhoneAuthProvider.provider().credential(withVerificationID: verificationID!, verificationCode: verificationCode)
        Auth.auth().signIn(with: credential) { authResult, error in
            if error == nil {
                // Phone number enrolled successfully
            } else {
                // Handle enrollment error
            }
        }
    }
}

This iOS code sends an SMS verification code and handles the user’s phone number enrollment for 2FA.

4. User Authentication with 2FA

After users have enrolled their phone numbers, they will need to complete the 2FA process during login. Firebase handles this process automatically. When a user logs in, Firebase sends an SMS verification code to their registered phone number. The user must enter this code to access their account. If the user’s phone number is not available or unreachable, Firebase provides alternative methods for verification.

5. Security Considerations

When implementing 2FA with Firebase, consider the following security best practices:

  • Rate Limiting: Implement rate limiting to prevent brute force attacks on SMS verification codes.
  • Session Management: Ensure secure session management to protect user data during 2FA.
  • Fallback Methods: Provide fallback methods for users without phone access to maintain account access.
Conclusion

Implementing Two-Factor Authentication (2FA) with Firebase is a vital step in enhancing the security of your application. With Firebase’s robust authentication system, you can provide users with a secure and seamless 2FA experience, protecting their accounts from unauthorized access.