freelabois / laravel-sms-verification
来源于 https://github.com/doge-dev/laravel-sms-verification 的分支
Requires
- aws/aws-sdk-php: ^3.62
- guzzlehttp/guzzle: *
- laravel/framework: 5.*
README
使用AWS SNS发送和验证短信验证码的库
该包包含一个特性和一个自定义验证规则,您可以在任何模型上使用短信验证码进行验证。
目录
安装
使用Composer拉取库
composer require doge-dev/laravel-sms-verification
在config/app.php
中添加服务提供者
DogeDev\SMSVerification\SMSVerificationServiceProvider::class,
将您的AWS凭证添加到.env文件中
DOGEDEV_AWS_SMS_ID=your-aws-access-key-id
DOGEDEV_AWS_SMS_SECRET=your-aws-secret-access-key
注意:请参阅AWS文档以了解有关AWS凭证的最佳实践,并考虑创建一个仅用于发送短信消息的专用用户,该用户具有受限权限
您可以通过添加此库中提供的VerifiesSMS特性将短信验证添加到任何模型,这将创建
- 一个函数 setSMSVerificationNumber($mobile) - 设置手机号码并发送包含验证码的短信消息
- 一个函数 verifySMSCode($code) - 验证短信验证码
- 以及用于验证短信验证码的一组私有方法。您可以在特性本身中查看它们以获取更多详细信息。
示例
将VerifiesSMSCode
特性添加到您的User模型(或您可能希望启用双因素认证的任何其他模型)
<?php namespace App; use DogeDev\SMSVerification\Traits\VerifiesSMSCode; use Laravel\Passport\HasApiTokens; use Illuminate\Notifications\Notifiable; use Jenssegers\Mongodb\Auth\User as Authenticatable; class User extends Authenticatable { use HasApiTokens, Notifiable, VerifiesSMSCode; ...
对于MySQL数据库,您需要在模型迁移中添加这些属性
$table->string('sms_verification_number')->default(''); // you can index this if you want $table->string('sms_verification_code')->default(''); $table->boolean('sms_verification_status')->default(false);
就是这样! :) 现在您可以发送短信验证码并在以后进行验证。
发送短信验证码
通过设置短信验证号码属性发送短信
$user->setSMSVerificationNumber($number)
这将向给定的 $number
发送短信。如果消息发送失败,将抛出异常。如果短信发送成功,模型上的 sms_verification_number
、sms_verification_code
和 sms_verification_status
属性将被设置。
之后,您可以在任何时候验证代码。
验证短信验证码
对于简单验证,您可以使用
$user->verifySMSCode($request->get('code'));
这将设置 sms_verification_status
属性为 true。如果启用了尝试限制,这将增加用户拥有的尝试次数。一旦超过此限制,将抛出TooManySMSVerificationAttempts异常。
设置短信验证尝试次数限制
您可以通过覆盖实现特性的模型的 $sms_verification_attempt_limit
来调整用户可以尝试验证代码的次数
<?php namespace App; use DogeDev\SMSVerification\Traits\VerifiesSMSCode; use Laravel\Passport\HasApiTokens; use Illuminate\Notifications\Notifiable; use Jenssegers\Mongodb\Auth\User as Authenticatable; class User extends Authenticatable { use HasApiTokens, Notifiable, VerifiesSMSCode; protected $sms_verification_attempt_limit = 10; ...
此值默认为5。
如果您不希望对用户尝试次数进行限制,请将此变量设置为0。
添加自定义验证以验证短信验证码
您可以通过添加验证轻松地在任何自定义请求上验证代码
<?php namespace App\Http\Requests; use Illuminate\Foundation\Http\FormRequest; class SomeCustomRequest extends FormRequest { /** * Determine if the user is authorized to make this request. * * @return bool */ public function authorize() { return true; } /** * Get the validation rules that apply to the request. * * @return array */ public function rules() { return [ 'code' => 'required|sms-code' ]; } }
验证器将尝试使用登录用户(Auth::user())验证代码。
使用路由模型绑定添加自定义验证以验证短信验证码
或者,您可以使用路由模型绑定并在您的自定义请求模型中创建验证
<?php namespace App\Http\Requests; use Illuminate\Foundation\Http\FormRequest; class UpdateAccountDetails extends FormRequest { /** * Determine if the user is authorized to make this request. * * @return bool */ public function authorize() { return true; } /** * Get the validation rules that apply to the request. * * @return array */ public function rules() { return [ 'code' => 'required|sms-code:account' ]; } }
在这种情况下,验证器期望在路由中找到account
对象。该对象需要实现上述提到的特性,以便验证可以工作。
更改发送的短信内容
您可以通过覆盖模型实现中的默认 getSMSVerificationMessage($code) 函数来设置通过短信发送的文本
class User extends Model { ... /** * Gets the message to be sent with the SMS * * @param $code * @return string */ public function getSMSVerificationMessage($code) { return "Here is your code for " . env("APP_NAME") . ": " . $code; } ... }
更改短信发送者
您可以通过覆盖模型实现中的默认 getSMSVerificationMessage($code) 函数来设置短信发送者
class User extends Model { ... /** * Gets the sender of the verification SMS * * @return string */ public function getSMSVerificationSender() { return "CustomName"; } ... }