sendinblue / otp
OATH 算法实现
Requires
- php: >=5.6.3
- sendinblue/base-32: ^1
Requires (Dev)
This package is not auto-updated.
Last update: 2024-09-15 04:52:30 UTC
README
OTP代表一次性密码:用作双因素认证的独特代码。此类代码的生成方法已由开放身份验证倡议发布。此包提供了实现这些算法的类。
安装
打开命令行,进入您的项目目录,并执行以下命令以下载此库的最新稳定版本
$ composer require sendinblue/otp "~1"
此命令要求您全局安装了Composer,如Composer文档的安装章节中所述。
OTP
SendinBlue\Otp\Otp
是所有OTP实现的基类,这意味着每个实现都将定义以下方法
generate
:生成OTP值check
:检查OTP值,抛出InvalidCodeException
getBase32Secret
:返回未填充的base32编码的秘密
HOTP (RFC4226)
您可以通过扩展SendinBlue\Otp\Hotp
类来处理HOTP值。您必须实现getCurrentIndex
方法以返回客户端当前的计数器值。如果您希望算法基于计数器(这可能是您想要的),那么您已经设置好了!如果它是基于序列的,您还必须通过返回给定索引处的序列元素来重写getElement
方法。
提供客户端
首先,大多数客户端仅支持基于计数器的HOTP。请务必注意这一点!
您的类将继承getBase32Secret
方法,这是最简单的方式:只需显示其返回值,并让用户复制其客户端中的值。请注意,最小的秘密长度为20字节。用户至少需要输入32个字符!
作为更好的替代方案,您可以显示generateQRCodeUrl
返回的URL作为二维码,以便由类似于FreeOTP Authenticator的应用程序扫描。请勿使用像Google Chart API这样的公共API生成二维码,因为URL将包含秘密!
重新同步
每当提供有效的HOTP代码时,您的服务器必须递增计数器,而客户端在每次请求新代码时都会递增计数器。这意味着客户端和服务器可能会不同步。为了允许重新同步,check
方法允许您作为第二个参数传递一个前瞻值,并将返回服务器计数器与客户端之间的差异。请注意,此值越大,代码的安全性越低。
TOTP (RFC6238)
TOTP比HOTP更易于使用,因为计数器是时间依赖的,这意味着您可以直接使用SendinBlue\Otp\Totp
类。您可以看到其构造函数提供了许多配置选项,但不幸的是,默认值可能是您唯一会使用的选项,因为一些应用程序仅支持这些默认值。
HOTP和TOTP之间的唯一区别将涉及重新同步:使用TOTP的客户端也可能比服务器晚,因此您可以将前瞻值和回溯值传递给check
方法。因此,它可以返回一个负值。
OCRA (RFC6287)
OCRA的开发正在进行中,请参阅ocra分支。