ferdous / laravel-otp-validate
用于OTP验证的Laravel包,内置重试和重新发送机制。内置最大重试和最大重新发送阻塞。OTP/安全码可以通过您选择的短信或电子邮件发送,并使用用户定义的模板。
Requires
- php: ^7.4|^8.0
- aws/aws-sdk-php: ^3.179
- guzzlehttp/guzzle: ^7.0.1
- nesbot/carbon: ^2.22
Requires (Dev)
- orchestra/testbench: ^6.0@dev
README
此包旨在简化OTP验证流程的设置。无需麻烦,只需即插即用。按照以下步骤操作,您将能够获得一个完整的OTP验证系统。您可以用它来以后进行身份验证或电子商务生产销售、订单确认。
从v2.0.1版本的重大变更
仅支持7.4及更高版本和8.0及更高版本,因此任何低于这些PHP版本的用户的将需要升级到最新版本。
- PHP版本7.4及更高版本
- PHP版本8.0及更高版本
如果您使用的是低于PHP 7.4的版本,请使用版本v1.4.0。
安装
安装包
使用composer要求此包
composer require ferdous/laravel-otp-validate
添加服务提供者 & 外观
对于Laravel 5.5+
一旦添加了包,服务提供者和外观将自动发现。
对于较老版本的Laravel
将服务提供者添加到config/app.php
中的提供者数组中
Ferdous\OtpValidator\OtpValidatorServiceProvider::class
将外观添加到config/app.php
中的别名数组中
'OtpValidator' => Ferdous\OtpValidator\OtpValidatorServiceProvider::class
发布配置
完成操作后,使用以下命令将配置发布到您的配置文件夹中
php artisan vendor:publish --provider="Ferdous\OtpValidator\OtpValidatorServiceProvider"
此命令将创建一个config/otp.php
文件。
电子邮件配置
从.env
文件设置电子邮件配置。无需其他更改。
请参阅otp.php
文件,了解有关可选自定义的信息,例如指定自定义Mailable
类的能力。
短信配置
由于短信网关使用不同的方法和额外的头和参数,您可能需要更新otp.php
文件中的短信配置。
迁移数据库
运行以下命令以创建otp表。
php artisan migrate
它将创建一个具有所需列的otp表。
环境
将以下键值对添加到Laravel应用程序中的.env
文件中
# Basic OTP Configs
OTP_SERVICE='enabled'
OTP_TABLE_NAME='otps'
OTP_TIMEOUT=120
OTP_DIGIT=5
OTP_RESEND_SERVICE='enabled'
OTP_MAX_RETRY=2
OTP_MAX_RESEND=1
# Company and Service
OTP_SERVICE_NAME=
OTP_COMPANY_NAME=
# OTP via Email / SMS
OTP_SEND_BY_EMAIL=1
OTP_SEND_BY_SMS=1
# Email Configurations
OTP_EMAIL_FROM=
OTP_EMAIL_FROM_NAME=
OTP_EMAIL_SUBJECT=
# SMS Configurations
OTP_SMSC_URL='https://sms'
OTP_SMSC_METHOD=
OTP_COUNTRY_CODE=
OTP_SMSC_OVER_JSON=
OTP_SMSC_PARAM_TO_NAME=
OTP_SMSC_PARAM_MSG_NAME=
OTP_SMSC_USER=
OTP_SMSC_PASS=
AWS_SNS_VERSION=
AWS_SNS_KEY=
AWS_SNS_SECRET=
AWS_SNS_REGION=
定义
配置中功能的定义
- service : 启用/禁用OTP服务
- timeout: OTP的超时时间
- digit: OTP数字
- resend-service: 启用/禁用重新发送服务
- max-retry: 单个请求的最大重试次数
- max-resend: 单个请求的最大重新发送次数
- service-name: 服务的使用目的
- company-name: 用于的公司
- send-by: 共有三种方式共享OTP(电子邮件/短信/AWS SNS)
- email: 此密钥指定电子邮件所需的信息(例如,from,名称,主题等。)
- sms: 使用短信网关发送短信。 (通用配置器)
在运行时定义"send-by"
可以使用config方法在运行时设置send-by [ SMS / Email / SNS ]。
config('otp.send-by.email', 1);
config('otp.send-by.sms', 0);
OTP请求模板
一旦模板文件已发布,请打开resources/views/vendor/template-otp/
示例控制器
运行以下命令以创建控制器。
php artisan make:controller OtpController
以下是在OtpController中调用OTP验证器的示例。
namespace App\Http\Controllers; use Ferdous\OtpValidator\Object\OtpRequestObject; use Ferdous\OtpValidator\OtpValidator; use Ferdous\OtpValidator\Object\OtpValidateRequestObject; class OtpController extends Controller { /** * @return array */ public function requestForOtp() { return OtpValidator::requestOtp( new OtpRequestObject('1432', 'buy-shirt', '01711084714', 'ferdousul.haque@gmail.com') ); } /** * @param Request $request * @return array */ public function validateOtp(Request $request) { $uniqId = $request->input('uniqueId'); $otp = $request->input('otp'); return OtpValidator::validateOtp( new OtpValidateRequestObject($uniqId,$otp) ); } /** * @param Request $request * @return array */ public function resendOtp(Request $request) { $uniqueId = $request->input('uniqueId'); return OtpValidator::resendOtp($uniqueId); } }
将以下内容添加到routes/web.php
文件中。
Route::get('/test/otp-request', [\App\Http\Controllers\OtpController::class, 'requestForOtp']);
Route::get('/test/otp-validate', [\App\Http\Controllers\OtpController::class, 'validateOtp']);
Route::get('/test/otp-resend', [\App\Http\Controllers\OtpController::class, 'resendOtp']);
响应/错误描述
以下表格描述了响应中生成的错误代码及其对应含义。
{ "code": 201, "message": "OTP Sent to the recipient", "requestId": 1432, "type": "buy-shirt" }
请求OTP响应代码
OTP验证响应代码
许可证
MIT
特别感谢
- Nahid Bin Azhar 对反馈的感谢。
支持
- 对于任何错误,请帮助创建一个问题。
- 对于安装或配置中的任何问题,随时联系我。ferdousul.haque@gmail.com
特色文章
示例 SMS 网关配置
Muthofun
如果您正在尝试集成孟加拉国最受欢迎的 SMS 网关之一,Muthofun 是我们国家流行的批量 SMS 网关。以下是 Muthofun SMS 网关的示例配置
'smsc' => [ 'url' => env('OTP_SMSC_URL'), 'method' => env('OTP_SMSC_METHOD', 'GET'), 'add_code' => env('OTP_COUNTRY_CODE',null), 'json' => env('OTP_SMSC_OVER_JSON',1), 'headers' => [], 'params' => [ 'send_to_param_name' => env('OTP_SMSC_PARAM_TO_NAME','number'), 'msg_param_name' => env('OTP_SMSC_PARAM_MSG_NAME','msg'), 'others' => [ 'user' => env('OTP_SMSC_USER'), 'password' => env('OTP_SMSC_PASS'), 'unicode' => 1 ], ] ];
.env 文件将如下所示
OTP_SMSC_URL='http://clients.muthofun.com:8901/esmsgw/sendsms.jsp?'
OTP_SMSC_METHOD='GET'
OTP_COUNTRY_CODE='88'
OTP_SMSC_OVER_JSON=0
OTP_SMSC_PARAM_TO_NAME='mobiles'
OTP_SMSC_PARAM_MSG_NAME='sms'
OTP_SMSC_USER='YourUserName'
OTP_SMSC_PASS='YourPassWord'
Infobip
示例:与著名的 SMS 网关 Infobip 平台集成。
使用 GET 方法
'smsc' => [ 'url' => env('OTP_SMSC_URL'), 'method' => env('OTP_SMSC_METHOD', 'GET'), 'add_code' => env('OTP_COUNTRY_CODE',null), 'json' => env('OTP_SMSC_OVER_JSON',1), 'headers' => [], 'params' => [ 'send_to_param_name' => env('OTP_SMSC_PARAM_TO_NAME','number'), 'msg_param_name' => env('OTP_SMSC_PARAM_MSG_NAME','msg'), 'others' => [ 'username' => env('OTP_SMSC_USER'), 'password' => env('OTP_SMSC_PASS'), 'from' => 'InfoSMS', 'flash' => true ], ] ];
.env 文件将如下所示
OTP_SMSC_URL='https://{baseUrl}/sms/1/text/query?'
OTP_SMSC_METHOD='GET'
OTP_COUNTRY_CODE='88'
OTP_SMSC_OVER_JSON=0
OTP_SMSC_PARAM_TO_NAME='to'
OTP_SMSC_PARAM_MSG_NAME='text'
OTP_SMSC_USER='YourUserName'
OTP_SMSC_PASS='YourPassWord'
msg91
与 msg91 SMS 网关集成的示例。
使用 GET 方法
'smsc' => [ 'url' => env('OTP_SMSC_URL'), 'method' => env('OTP_SMSC_METHOD', 'GET'), 'add_code' => env('OTP_COUNTRY_CODE',null), 'json' => env('OTP_SMSC_OVER_JSON',1), 'headers' => [], 'params' => [ 'send_to_param_name' => env('OTP_SMSC_PARAM_TO_NAME','number'), 'msg_param_name' => env('OTP_SMSC_PARAM_MSG_NAME','msg'), 'others' => [ 'authkey' => 'YourAuthKey', 'sender' => 'YourSenderId', 'route' => '1', 'country' => '88', ], ], 'wrapper' => 'sms', ];
.env 文件将如下所示
OTP_SMSC_URL='https://control.msg91.com/api/v2/sendsms?'
OTP_SMSC_METHOD='POST'
OTP_COUNTRY_CODE='88'
OTP_SMSC_OVER_JSON=1
OTP_SMSC_PARAM_TO_NAME='to'
OTP_SMSC_PARAM_MSG_NAME='text'
OTP_SMSC_USER='YourUserName'
OTP_SMSC_PASS='YourPassWord'
使用 AWS 简单通知服务 (SNS)
与 AWS SNS 集成的示例步骤。
创建具有适当策略权限的 IAM 用户。转到 IAM 服务并创建您的应用程序用户;请确保捕获其 AWS 密钥和 AWS 密码值并将其放入您的环境文件中。然后向该用户或其组添加以下策略。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowSendingSMSMessages",
"Effect": "Allow",
"Action": [
"sns:Publish",
"sns:CheckIfPhoneNumberIsOptedOut"
],
"Resource": [
"*"
]
}
]
}
在此处,我们设置了发布、检查退订选项的能力,并将其应用于通配符资源而不是特定主题,因为我们将直接向电话号码发送通知而不是 SNS 主题。