worksome / verify-by-phone
通过电话或短信验证您的用户
Requires
- php: ^8.2
- illuminate/contracts: ^10.0 || ^11.0
- propaganistas/laravel-phone: ^5.2
- spatie/laravel-package-tools: ^1.16
- twilio/sdk: ^6.44 || ^7.0
Requires (Dev)
- guzzlehttp/guzzle: ^7.8
- nunomaduro/collision: ^7.10 || ^8.1
- orchestra/testbench: ^8.21 || ^9.0
- pestphp/pest: ^2.33
- pestphp/pest-plugin-laravel: ^2.2
- worksome/coding-style: ^2.10
README
这是一种常见的做法:用户注册,你向他们的手机发送带有代码的短信,他们在你的应用程序中输入该代码,然后他们就可以继续使用了。
这个包使得将此功能添加到Laravel应用程序变得简单。
安装
您可以通过composer安装此包
composer require worksome/verify-by-phone
您可以通过运行以下命令发布配置文件
php artisan vendor:publish --tag="verify-by-phone-config"
配置
此包旨在支持多种验证服务。主要服务是 Twilio。您可以在 config/verify-by-phone.php
文件下的 driver
中配置此服务,或者使用专用的 .env
变量:VERIFY_BY_PHONE_DRIVER
。
twilio
要使用我们的Twilio集成,您需要提供 account_sid
、auth_token
和 verify_sid
。所有这些都可以在 config/verify-by-phone.php
文件下的 services.twilio
中设置。
用法
要使用此包,您想将 \Worksome\VerifyByPhone\Contracts\PhoneVerificationService
接口注入到您的应用程序中。让我们想象一下,您想在控制器方法中发送验证代码
public function sendVerificationCode(Request $request, PhoneVerificationService $verificationService) { // Send a verification code to the given number $verificationService->send(new PhoneNumber($request->input('phone'))); return redirect(route('home'))->with('message', 'Verification code sent!'); }
就是这样简单!请注意,我们正在使用 \Propaganistas\LaravelPhone\PhoneNumber
安全地解析不同格式的数字。
现在,当用户收到他们的验证代码时,您想检查它是否有效。使用 verify
方法来完成此操作
public function verifyCode(Request $request, PhoneVerificationService $verificationService) { // Verify the verification code for the given phone number $valid = $verificationService->verify( new PhoneNumber($request->input('phone')), $request->input('code') ); if ($valid) { // Mark your user as valid } }
第一个参数是电话号码(再次使用 \Propaganistas\LaravelPhone\PhoneNumber
),第二个是用户提供的验证代码。
验证规则
我们提供了一个规则,使验证验证代码变得简单。
请注意,此规则将调用
PhoneVerificationService
接口的verify
方法,并且可能会进行HTTP请求。
Validator::validate($request->all(), [ 'phone_number' => ['required'], 'verification_code' => ['required', Rule::verificationCodeIsValid('phone_number')], ]);
如果您的数据不包含电话号码,您也可以手动传入
Validator::validate($request->all(), [ 'verification_code' => ['required', Rule::verificationCodeIsValid('+441174960123')], ]);
我们扩展了 Rule
类,以与其他规则保持视觉一致性,但您也可以直接使用 VerificationCodeIsValid
规则,以获得更好的IDE支持
Validator::validate($request->all(), [ 'verification_code' => ['required', new VerificationCodeIsValid('+441174960123')], ]);
此规则还将处理验证代码已过期的情况,并返回适当的错误消息。
Artisan命令
此包附带了一些Artisan命令,允许您发送和验证验证代码。
# Send a verication code to the given phone number php artisan verify-by-phone:send "+441174960123" # Check that a given verication code is valid for the given phone number php artisan verify-by-phone:verify "+441174960123" 1234
如果验证失败,verify命令将在控制台返回失败
测试
在编写测试时,您可能不希望对Twilio等服务进行实际请求。为了支持测试,我们提供了一个 FakeVerificationService
,它可以用来模拟验证服务。要使用它,您应该在 phpunit.xml
中设置一个 env
变量,其值如下
<env name='VERIFY_BY_PHONE_DRIVER' value='null'/>
或者,您可以通过使用 swap
方法在测试中手动更换集成。伪造实现有一些有用的测试方法可供使用
it('tests something to do with SMS verification', function () { $service = new FakeVerificationService(); $this->swap(PhoneVerificationService::class, $service); // Customise what happens when calling `send` $service->sendUsing(fn () => throw new Exception('Something went wrong')); // Customise what happens when calling `verify` $service->verifyUsing(fn () => throw new Exception('Something went wrong')); // Throw a VerificationCodeExpiredException $service->actAsThoughTheVerificationCodeExpired(); // Assert that a verification was "sent" on the given number $service->assertSentVerification(new PhoneNumber('+441174960123')); });
您可以通过运行以下命令来执行此项目的测试
composer test
变更日志
有关最近更改的更多信息,请参阅 GitHub Releases
贡献
有关详细信息,请参阅 CONTRIBUTING
安全漏洞
有关如何报告安全漏洞,请参阅 我们的安全策略
致谢
许可证
MIT许可证(MIT)。有关更多信息,请参阅许可证文件。