Генератор для счетчиков на основе встреч (RFC 4226) и времени на основе времени (RFC 6238) одно временные пароли (OTP). (aka еще одна реализация Google Authenticator!)
ext-curl для синхронизации времени сервера Steam Guardext-sodium для постоянного времени реализации Encode/Decode Base64 и Hex2bin/bin2Hex ( paragonie/constant_time_encoding используется в качестве резерва) Требуется композитор
Через терминал: composer require chillerlan/php-authenticator
Composer.json
{
"require" : {
"php" : " ^8.2 " ,
"chillerlan/php-authenticator" : " dev-main "
}
} Примечание. Замените dev-main на ограничение версии, например ^5.0 - См. Выпуск для действительных версий
Выгода!
Секрет обычно создается один раз во время процесса активации на панели управления пользователем. Таким образом, все, что вам нужно сделать, это удобно отобразить его пользователю - например, в виде текстовой строки и QR -кода - и сохранить его где -то с пользовательскими данными.
use chillerlan Authenticator { Authenticator , AuthenticatorOptions };
$ options = new AuthenticatorOptions ;
$ options -> secret_length = 32 ;
$ authenticator = new Authenticator ( $ options );
// create a secret (stored somewhere in a *safe* place on the server. safe... hahaha jk)
$ secret = $ authenticator -> createSecret ();
// you can also specify the length of the secret key, which overrides the options setting
$ secret = $ authenticator -> createSecret ( 20 );
// set an existing secret
$ authenticator -> setSecret ( $ secret ); Секрет, созданный Authenticator::createSecret() также будет храниться внутри, так что вам не нужно предоставлять секрет, который вы только что создали на последующих операциях с текущим экземпляром.
Теперь во время процесса входа в систему - после того, как пользователь успешно ввел свои учетные данные - вы попросите их провести одноразовый код, чтобы проверить его с секретом из вашей базы данных пользователей.
// verify the code
if ( $ authenticator -> verify ( $ otp )){
// that's it - 2FA has never been easier! :D
}Проверьте соседние коды
// try the first adjacent
$ authenticator -> verify ( $ otp , time () - $ options -> period ); // -> true
// try the second adjacent, default is 1
$ authenticator -> verify ( $ otp , time () + 2 * $ options -> period ); // -> false
// allow 2 adjacent codes
$ options -> adjacent = 2 ;
$ authenticator -> verify ( $ otp , time () + 2 * $ options -> period ); // -> true // switch mode to HOTP
$ options -> mode = AuthenticatorInterface:: HOTP ;
// user sends the OTP for code #42, which is equivalent to
$ otp = $ authenticator -> code ( 42 ); // -> 123456
// verify [123456, 42]
$ authenticator -> verify ( $ otp , $ counterValueFromUserDatabase ) // -> true Чтобы отобразить QR -код для мобильного аутентификатора, вам понадобится otpauth:// uri, который можно создать с помощью следующего метода.
$label должен быть чем -то, что идентифицирует учетную запись, к которой принадлежит секрет$issuer - это название вашего веб -сайта или компании, например, поэтому пользователь может идентифицировать несколько учетных записей. $ uri = $ authenticator -> getUri ( $ label , $ issuer );
// -> otpauth://totp/my%20label?secret=NKSOQG7UKKID4IXW&issuer=chillerlan.net&digits=6&period=30&algorithm=SHA1 Имейте в виду, что несколько настроек URI (пока) не распознаются всеми аутентификаторами. Проверьте Google Authenticator Wiki для получения дополнительной информации.
// code length, currently 6 or 8
$ options -> digits = 8 ;
// valid period between 15 and 60 seconds
$ options -> period = 45 ;
// set the HMAC hash algorithm
$ options -> algorithm = AuthenticatorInterface:: ALGO_SHA512 ;Authenticator| метод | возвращаться | описание |
|---|---|---|
__construct(SettingsContainerInterface $options = null, string $secret = null) | - | |
setOptions(SettingsContainerInterface $options) | Authenticator | Внутренне называется __construct() |
setSecret(string $secret) | Authenticator | Внутренне называется __construct() |
getSecret() | string | |
createSecret(int $length = null) | string | $length переопределяет настройки AuthenticatorOptions |
code(int $data = null) | string | $data могут быть временным меткой UNIX (TOTP) или значением счетчика (HOTP) |
verify(string $otp, int $data = null) | bool | $data см. Authenticator::code() |
getUri(string $label, string $issuer, int $hotpCounter = null, bool $omitSettings = null) | string |
AuthenticatorOptions | свойство | тип | по умолчанию | допустимый | описание |
|---|---|---|---|---|
$digits | int | 6 | 6 или 8 | Длина кода авто |
$period | int | 30 | 15 - 60 | период проверки (секунды) |
$secret_length | int | 20 | > = 16 | Длина секретной фразы (байты, некодированный бинар) |
$algorithm | string | SHA1 | SHA1 , SHA256 или SHA512 | Алгоритм хеша HMAC см. AuthenticatorInterface::HASH_ALGOS |
$mode | string | totp | totp , hotp , battlenet или steam | Режим аутентификатора: на основе времени или счетчика, см. AuthenticatorInterface::MODES |
$adjacent | int | 1 | > = 0 | количество разрешенных соседних кодов |
$time_offset | int | 0 | * | Фиксированное смещение времени, которое будет добавлено к текущему значению времени |
$useLocalTime | bool | истинный | * | использовать ли локальное время или запросы на серверное время |
$forceTimeRefresh | bool | ЛОЖЬ | * | Стоит ли заставлять освежающий сервер на каждом вызове |
AuthenticatorInterface | метод | возвращаться | описание |
|---|---|---|
setOptions(SettingsContainerInterface $options) | AuthenticatorInterface | |
setSecret(string $encodedSecret) | AuthenticatorInterface | |
getSecret() | string | |
createSecret(int $length = null) | string | |
getServertime() | int | |
getCounter(int $data = null) | int | внутренний |
getHMAC(int $counter) | string | внутренний |
getCode(string $hmac) | int | внутренний |
getOTP(int $code) | string | внутренний |
code(int $data = null) | string | |
verify(string $otp, int $data = null) | bool |
| постоянный | тип | описание |
|---|---|---|
TOTP | string | |
HOTP | string | |
STEAM_GUARD | string | |
ALGO_SHA1 | string | |
ALGO_SHA256 | string | |
ALGO_SHA512 | string | |
MODES | array | Карта режима -> имя класса |
HASH_ALGOS | array | Список доступных хэш -алгоритмов |