chillerlan / php-authenticator
基于计数器和时间的双因素认证码生成器(Google Authenticator)。PHP 8.2+
5.2.1
2024-07-16 23:53 UTC
Requires
- php: ^8.2
- chillerlan/php-settings-container: ^3.2.1
- paragonie/constant_time_encoding: ^3.0
Requires (Dev)
- ext-curl: *
- ext-json: *
- ext-sodium: *
- phpmd/phpmd: ^2.15
- phpstan/phpstan: ^1.11
- phpstan/phpstan-deprecation-rules: ^1.2
- phpunit/phpunit: ^11.2
- squizlabs/php_codesniffer: ^3.10
Suggests
- chillerlan/php-qrcode: Create QR Codes for use with an authenticator app.
README
基于计数器(RFC 4226)和时间基于(RFC 6238)的一次性密码(OTP)。(也称为另一种Google Authenticator实现!)
文档
要求
- PHP 8.2+
- Steam Guard服务器时间同步需要
ext-curl
- base64编码/解码和hex2bin/bin2hex的恒定时间实现需要
ext-sodium
(作为后备使用paragonie/constant_time_encoding
)
- Steam Guard服务器时间同步需要
安装
需要 composer
通过终端: 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 }
基于时间(TOTP)
验证相邻的密码
// 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
基于计数器(HOTP)
// 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
URI创建
为了显示用于移动认证器的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 维基
// 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;