Home Arrow Icon Knowledge base Arrow Icon Global Arrow Icon How do I integrate Google Authenticator with Laravel Fortify for two-factor authentication
    Laravel CSRF


How do I integrate Google Authenticator with Laravel Fortify for two-factor authentication


To integrate Google Authenticator with Laravel Fortify for two-factor authentication, you can follow these steps:

1. Install a TOTP (Time-based One-Time Password) package:

You can use a package like `pragmarx/google2fa-laravel` to handle the TOTP functionality. Install it using Composer:

bash
composer require pragmarx/google2fa-laravel

2. Implement the `TwoFactorAuthenticatable` trait in your `User` model:

php
use Laravel\Fortify\TwoFactorAuthenticatable;
use PragmaRX\Google2FALaravel\Google2FA;

class User extends Authenticatable
{
    use TwoFactorAuthenticatable;

    /**
     * Get the user's Google2FA secret.
     *
     * @return string
     */
    public function getGoogleAuthenticatorSecretKey()
    {
        return $this->two_factor_secret;
    }

    /**
     * Set the user's Google2FA secret.
     *
     * @param  string  $secret
     * @return void
     */
    public function setGoogleAuthenticatorSecretKey($secret)
    {
        $this->two_factor_secret = $secret;
    }
}

3. Implement the two-factor authentication management UI:

Create a view where users can enable or disable two-factor authentication using Google Authenticator. This view should make a POST request to the `/user/two-factor-authentication` endpoint to toggle the 2FA setting.

html
<form method="POST" action="/user/two-factor-authentication">
    @csrf

    @if (auth()->user()->two_factor_secret)
        <button type="submit" name="disable" class="btn btn-danger">
            Disable Two-Factor Authentication
        </button>
    @else
        <button type="submit" name="enable" class="btn btn-success">
            Enable Two-Factor Authentication
        </button>
    @endif
</form>

4. Implement the two-factor challenge view:

Create a view that will be displayed when the user needs to enter the TOTP code during the login process. This view should make a POST request to the `/two-factor-challenge` endpoint.

html
@extends('layouts.app')

@section('content')
    <form method="POST" action="/two-factor-challenge">
        @csrf

        <label>{{ __('Code') }}</label>
        <input type="text" name="code" />

        <button>
            Login
        </button>
    </form>
@endsection

5. Configure the two-factor authentication in your `FortifyServiceProvider`:

php
use Laravel\Fortify\Fortify;
use PragmaRX\Google2FALaravel\Google2FA;

public function boot()
{
    Fortify::twoFactorAuthentication(function ($request, $user) {
        $google2fa = app(Google2FA::class);

        if ($user->two_factor_secret) {
            $secret = $user->getGoogleAuthenticatorSecretKey();
            $valid = $google2fa->verifyKey($secret, $request->input('code'));

            if ($valid) {
                return true;
            }
        }

        return false;
    });

    Fortify::twoFactorChallengeView(function () {
        return view('auth.two-factor-challenge');
    });
}

In this example, the `twoFactorAuthentication` method checks if the user has a two-factor secret set. If so, it uses the `Google2FA` class to verify the TOTP code entered by the user. If the code is valid, the method returns `true` to allow the user to authenticate.

The `twoFactorChallengeView` method specifies the view that should be displayed when the user needs to enter the TOTP code.

By following these steps, you can integrate Google Authenticator with Laravel Fortify for two-factor authentication in your application.

Citations:
[1] https://www.youtube.com/watch?v=rDCqS277dVQ
[2] https://epndavis.com/blog/laravel-fortify-two-factor-authentication/
[3] https://codecourse.com/watch/authentication-with-laravel-fortify/two-factor-authentication-laravel-fortify
[4] https://www.youtube.com/watch?v=EVWmma7nXak
[5] https://blog.devgenius.io/complete-laravel-8-authentication-using-laravel-fortify-and-bootstrap-4-part-2-d62ce4ed7577?gi=b17ce6064ae4