chillerlan/php-authenticator

基于计数器和时间的双因素认证码生成器(Google Authenticator)。PHP 8.2+

5.2.1 2024-07-16 23:53 UTC

This package is auto-updated.

Last update: 2024-09-18 21:06:19 UTC


README

基于计数器(RFC 4226)和时间基于(RFC 6238)的一次性密码(OTP)。(也称为另一种Google Authenticator实现!)

PHP Version Support version License GitHub actions workflow Coverage Codacy Downloads

文档

要求

安装

需要 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;

API

Authenticator

AuthenticatorOptions

属性

AuthenticatorInterface

方法

常量

2FA ALL THE THINGS!