teckwei1993/laravel-otp

Laravel OTP 生成器及验证

v1.0.12 2024-04-20 09:33 UTC

This package is auto-updated.

Last update: 2024-09-20 10:35:26 UTC


README

Latest Version on Packagist Software License Total Downloads

简介

一个用于 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):密码长度。默认:6
  • setFormat($format):格式选项允许您在生成新密码时决定使用哪种生成器实现。选项:'string','numeric','numeric-no-zero','customize'。默认:"numeric"。
  • setExpires($minutes):密码的有效期(分钟)。默认:15
  • setRepeated($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)。

如果你喜欢这个项目,请考虑支持我

Buy Me A Coffee