freelabois/laravel-sms-verification

来源于 https://github.com/doge-dev/laravel-sms-verification 的分支

0.0.7 2019-07-24 20:38 UTC

This package is auto-updated.

Last update: 2024-09-25 08:39:32 UTC


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_numbersms_verification_codesms_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";
    }
    
    ...
}