Двухфакторная авторизация для PHP с использованием приложения Google Authenticator

Двухфакторная авторизация используется для повышения защиты аккаунтов пользователей от несанкционированного доступа. Множество людей используют одни и те же связки логин-пароль для доступа к разным сайтам, и это может быть использовано злоумышленниками.

Включение двухфакторной авторизации на нашем сайте приведет к тому, что то при каждом новом входе система будет дополнительно запрашивать у пользователя динамический 6-значный код. Таким образом злоумышленник, завладевший логином и паролем пользователя, не сможет получить доступ к этому аккаунту.

Динамический код может быть получен разными способами, в данном случае мы рассмотрим использование программы Google Authenticator. Для добавления двухфакторной авторизации на сайт нам потребуется библиотека GoogleAuthenticator.php (автор Christian Stocker).

Пошаговая инструкция

  1. Добавляем библиотеку в наш проект (нужны только 2 файла из дистрибутива).

    FixedByteNotation.php
    GoogleAuthenticator.php 
    


  2. Подключаем класс GoogleAuthenticator в наш скрипт.

    require_once('GoogleAuthenticator.php');
    

  3. После того, как пользователь первый раз включил двухфакторную авторизацию необходимо вычислить и сохранить его секретный ключ. Этот секретный ключ используется для генерации и проверки динамических кодов.

    $ga=new GoogleAuthenticator;
    $user->ga_secret=$ga->generateSecret();
    $user->save();
    


  4. Когда получен секретный ключ следует показать пользователю инструкцию по установке программы Google Authenticator (можно воспользоваться инструкцией от Google).

    Также потребуется вывести QR-code -это позволит легко добавить ключ для нашего сайта в программу Google Authenticator.
    Разумным решением также является ввод проверочного кода, это служит сигналом что пользователь успешно установил программу и для него можно включать второй фактор авторизации.

    Для показа QR-кода можно воспользоваться методом getUrl класса GoogleAuthenticator.

    $ga=new GoogleAuthenticator;
    $ga->getUrl($user->login,'mysite.com',$user->ga_secret);
    
    


    Либо собрать адрес картинки самостоятельно.

    $url =  sprintf("otpauth://totp/%s?secret=%s", $alias, $secret);
    $encoder = 'https://chart.googleapis.com/chart?chs=200x200&chld=M|0&cht=qr&chl=';
    $qrImageURL = sprintf( "%s%s",$encoder, urlencode($url));
    
    


  5. Проверка введенного в авторизационную форму секретного кода.

    $ga=new GoogleAuthenticator;
    $code=$ga->getCode($user->ga_secret);
    if ($code!=$_POST['code']) return new AuthError('invalid code');
    


    Переменная $code должна соответствовать введенному пользователем в форму входа.



Эти несложные действия позволят повысить безопасность посетителей нашего сайта.

Демонстрационная версия доступна по адресу googleauth.phpbee.org/users
Метки:
php, google authenticator

Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.