teckwei1993 / laravel-otp
Laravel OTP 生成器及验证
v1.0.12
2024-04-20 09:33 UTC
Requires
- php: ^5.5.9|^7.0|^8.0
- illuminate/support: ^5.2|^6.0|^7.0|^8.0|^9.0|^10.0|^11.0
README
简介
一个用于 Laravel 一次性密码 (OTP) 生成和验证的包,无需 Eloquent 模型,因为它通过 缓存 实现。缓存连接与您的 Laravel 缓存配置相同,并支持: "apc", "array", "database", "file", "memcached", "redis"。
安装
通过 composer 安装
composer require teckwei1993/laravel-otp
添加服务提供者 & 外观
对于 Laravel 5.5+
一旦添加了该包,服务提供者和外观将被自动发现。
对于 Laravel 5.2 / 5.3 / 5.4
将 ServiceProvider 添加到 config/app.php
中的 providers 数组
Teckwei1993\Otp\OtpServiceProvider::class
将 Facade 添加到 config/app.php
中的 aliases 数组
'Otp' => Teckwei1993\Otp\OtpFacade::class
配置
发布配置和语言文件
php artisan vendor:publish --provider="Teckwei1993\Otp\OtpServiceProvider"
此包会在您的应用程序的配置文件夹中发布一个 otp.php
文件,其中包含此包的设置。大多数变量都绑定到环境变量,您可以在 Laravel 应用程序的 .env
文件中添加键值对。
OTP_FORMAT=numeric
OTP_LENGTH=6
OTP_SENSITIVE=false
OTP_EXPIRES_TIME=15
OTP_ATTEMPT_TIMES=5
OTP_REPEATED=true
OTP_DEMO=false
使用方法
生成 OTP
Otp::generate(string $identifier)
$identifier
:与 OTP 相关联的标识。
示例
use OTP; // in controller $password = Otp::generate('reg:name@domain.com');
这将生成一个有效期为 15 分钟的 OTP。
验证 OTP
Otp::validate(string $identifier, string $password)
$identifier
:与 OTP 相关联的标识。$password
:与标识关联的密码。
示例
use OTP; // in controller $result = Otp::validate('reg:name@domain.com', '123456');
响应
成功
{
"status": true
}
无效 OTP
{
"status": false,
"error": "invalid"
}
过期
{
"status": false,
"error": "expired"
}
最大尝试次数
{
"status": false,
"error": "max_attempt"
}
- 达到最大允许尝试次数,默认为每个标识 10 次
通过 Laravel 验证器验证 OTP
// in a `FormRequest` use Teckwei1993\Otp\Rules\OtpValidate; public function rules() { return [ 'code' => ['required', new OtpValidate('change-email:name@domain.com')] ]; } // in a controller $request->validate([ 'code' => ['required', new OtpValidate('change-email:name@domain.com')] ]);
通过会话 ID 验证 OTP
// Otp class $result = Otp::validate('123456'); // in a `FormRequest` use Teckwei1993\Otp\Rules\OtpValidate; public function rules() { return [ 'code' => ['required', new OtpValidate()] ]; } // in a controller $request->validate([ 'code' => ['required', new OtpValidate()] ]);
- 未设置标识的设置将自动使用会话 ID 作为默认值,OTP 生成和验证将在同一会话(浏览器的 cookie)中完成。
高级使用
带选项生成 OTP
$password = Otp::setLength(8)->setFormat('string')->setExpires(60)->setRepeated(false)->generate('identifier-key-here'); // or array option $password = Otp::generate('identifier-key-here', [ 'length' => 8, 'format' => 'string', 'expires' => 60, 'repeated' => false ]);
setLength($length)
:密码长度。默认:6setFormat($format)
:格式选项允许您在生成新密码时决定使用哪种生成器实现。选项:'string','numeric','numeric-no-zero','customize'。默认:"numeric"。setExpires($minutes)
:密码的有效期(分钟)。默认:15setRepeated($boolean)
:密码的重复性。新密码生成后,直到使用一次或自身过期,之前的密码仍然有效。默认:true
带自定义密码生成 OTP
$password = Otp::setCustomize('12345678ABC@#$')->generate('identifier-key-here');
setCustomize($string)
:从自定义字符串中随机选择字母
带特定尝试次数验证 OTP
$password = Otp::setAttempts(3)->validate('identifier-key-here', 'password-here');
setAttempts($times)
:不正确的密码尝试次数。默认:5
带大小写敏感验证 OTP
$password = Otp::setSensitive(true)->generate('identifier-key-here'); // validate $result = Otp::setSensitive(true)->validate('identifier-key-here', 'password-here'); // in controller use Teckwei1993\Otp\Rules\OtpValidate; $request->validate([ 'code' => ['required', new OtpValidate('identifier-key-here', ['sensitive' => true])] ]);
setSensitive($boolean)
:要求正确输入大写和小写字母。默认:true
带单独密码生成 OTP
$password = Otp::setLength([4,3,4])->setSeparator(':')->generate('identifier-key-here');
示例密码
3526:126:3697
setLength($array)
:密码长度,使用数组来分隔每个长度。setSeparator($string)
:密码分隔符。默认:"-"
带额外数据验证 OTP
$password = Otp::setData(['user_id' => auth()->id()])->generate('login-confirmation');
setData($var)
:允许您获取 OTP 的额外数据。
// validate $result = Otp::setDisposable(false)->validate('login-confirmation', 'password-here'); // in controller use Teckwei1993\Otp\Rules\OtpValidate; $request->validate([ 'code' => ['required', new OtpValidate('login-confirmation', ['disposable' => false])] ]);
setDisposable($boolean)
:OTP 标识的可消耗性,当使用相同的标识密码时,不同的密码无效。默认:true
成功响应
{
"status": true,
"data": [
"user_id": 10
]
}
- 当您将可消耗性设置为
false
时,您可以为同一 OTP 标识键中的不同用户支持不同密码和不同额外数据。
带跳过使用验证 OTP
// validate $result = Otp::setSkip(true)->validate('identifier-key-here', 'password-here'); // in controller use Teckwei1993\Otp\Rules\OtpValidate; $request->validate([ 'code' => ['required', new OtpValidate('identifier-key-here', ['skip' => true])] ]);
setSkip($boolean)
:在验证时跳过使用密码,这意味着您可以再次重用密码。默认:false- 当表单请求有错误响应时,将跳过使用密码,但请记得在控制器中调用
OTP::validate(...)
。
删除OTP
Otp::forget('identifier-key-here');
- 删除具有此特定标识符的所有密码
删除特定密码
Otp::forget('identifier-key-here', 'password-here');
重置尝试次数
Otp::resetAttempt('identifier-key-here');
演示密码
将以下键值对添加到Laravel应用程序中的.env
文件中。
OTP_DEMO=true
- 开发目的的演示模式,无需使用真实密码进行验证。
- 默认演示密码:"1234", "123456", "12345678"
贡献
欢迎所有贡献!😄
许可证
MIT许可证(MIT)。
如果你喜欢这个项目,请考虑支持我