Двухфакторная авторизация для 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
Tags:
php, google authenticator

You can't comment this post because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author's username will be hidden by an alias.