tzm / authorizator
这是一个易于使用、功能强大且可扩展的Laravel包,通过自定义渠道授权用户操作。
Requires
- php: ^7.2
- guzzlehttp/guzzle: ~6.0
README
这是一个易于使用、经过测试、功能强大且可扩展的Laravel包,通过自定义渠道授权用户操作。它通过向用户发送授权代码(例如通过短信或电子邮件)并进行验证来实现。
您可以配置任意多的渠道。每个操作都可以提供任何渠道配置。包含Blade模板和VUE组件。
使用此包,您可以通过自定义代码交付渠道(例如SMS、电子邮件等)定义如下独立操作:两步验证、删除账户、授权交易等。
使用示例
- 两步验证,
- 授权用户数据更改,
- 确认交易,
- 确认删除账户,
- 确认电话号码,
- 需要通过电子邮件、短信、语音电话等单独渠道进行用户授权的任何其他操作。
目录
安装
通过composer添加包
composer require tzm/authorizator
要了解如何配置此包,请访问如何使用部分
如何工作
包的流程图如下所示
- 如果用户提供的操作需要额外的授权,将显示表单。 用户必须已登录(当然,您可以实现自己的逻辑)。
- 用户选择渠道(每个操作都可以有自己的渠道,默认情况下,您可以使用一个或多个渠道)。
- 生成代码并通过指定渠道发送给用户。
- 用户输入代码。
- 在代码验证成功后,执行自定义操作。
详细工作原理
要了解包的工作流程,让我们深入了解。
需要提供 Tzm\Authorizator\Service\AuthorizatorAction
和 Tzm\Authorizator\Service\AuthorizatorChannels\Channel
的两种类型的类。第一个类负责处理授权的给定操作。在这个类中,您将设置在成功验证授权代码后要执行的操作。这个类还包含验证后的返回路径、代码时间过期和允许的渠道信息。第二个类提供代码交付渠道,如电子邮件、短信等。它包含一个将授权代码发送给用户的方法。这两个都可以通过Artisan命令创建。
php artisan authorizator:make-action
php artisan authorizator:make-channel
开箱即用的包包含vue组件。此组件包含所有表单和方法。有两个端点:authorization/send
和 authorization/check
(两者都使用POST
方法)。这些端点位于Tzm\Authorizator\Controller\AuthorizationController
中。还有一个authorization/create
端点,但我们将稍后讨论。
在请求授权的控制器中(或任何其他位置,如中间件等),会在数据库中创建新的授权。这是通过执行静态方法 Transaction::createAuth()
实现的。Transaction
对象扩展了 Tzm\Authorizator\Service\AuthorizatorAction
类。同时,新的变量存储在用户会话中(默认名称为 _authorizator_uuid
,并包含数据库中的 uuid
)。接下来,通过 response()
方法将视图返回给用户。因此,控制器看起来很简单。
use App\Services\AuthorizationActions\Transaction; class TransactionController extends Controller { public function create() { return Transaction::createAuth()->response(); } }
注意: Transaction
类继承自 Tzm\Authorizator\Service\AuthorizatorAction
。
您还可以指定响应类型(Blade 视图或 HTTP 响应代码)。基本上,您可以将属性 $shouldReturnView
设置为 false 以接收响应代码 201
,或者可以使用 setResponseAsView(bool $shouldReturnView)
方法。
在 Vue 组件中,用户可以选择配送渠道(如果有多个)。请求通过 POST
方法发送到 authorization/send
端点。
接下来,通过从 Tzm\Authorizator\Service\AuthorizatorChannel\Channel
继承的 sendMessage()
方法将代码发送给用户。这是通过 authorization/send
端点完成的。
用户将此代码输入到表单中。如果代码有效(通过 authorization/check
端点),它将被设置为数据库中的已使用(列 verified_at
设置为当前时间)。最后,执行从继承的 Tzm\Authorizator\Service\AuthorizatorAction
类的 afterAuthorization()
。这是此包中最重要的操作。在此方法中,您将编写在代码成功验证后运行的代码。
通过POST方法创建授权
如果您的应用程序需要通过 POST
方法创建新的授权代码,您可以使用 authorization/create
端点。在您的 POST
请求中,您必须添加一个名为 class
的参数,其中包含扩展 AuthorizatorAction
的类的名称。
如何使用
准备工作
注意!
默认情况下,此包使用 Vue 组件,但如果您不想使用 Vue.js 作为前端框架,您可以创建自己的表单处理程序。
要使用处理授权的 Vue 组件,在 app.js
包的 .vue
文件中声明。
Vue.component('authorizator-form', require('../../vendor/tzm/authorizator/src/resources/js/components/AuthorizatorForm').default);
别忘了运行 npm run watch
以生成资产!
注意,您的应用程序需要使用 Vue.js:[https://laravel.net.cn/docs/master/frontend#writing-vue-components](https://laravel.net.cn/docs/master/frontend#writing-vue-components)。
在 自定义 部分中了解更多有关自定义包的信息。
创建代码交付渠道
您可以通过 Artisan 命令添加示例通道类。
php artisan authorizator:make-channel
此类将出现在 app\Authorizator\Channels
文件夹中。
请注意,通道类必须扩展 Tzm\Authorizator\Service\AuthorizatorChannels\Channel
抽象类,否则将抛出 AuthorizatorException
。
此类需要三个方法
getChannelDescription()
- 将生成当前通道的描述,例如,可以由本地化.json
文件生成。它将在通道选择表单的无线电标签中显示。getChannelName()
- 返回通道名称。如果有多个通道,它将显示。sendMessage(User $user, $code)
- 此方法提供代码发送给用户。在此方法中,您将处理代码如何发送给用户。例如,如果您想通过电子邮件发送代码,可以使用 Laravel 邮件外观:Mail::to($user)->send(new SendAuthorizationCode($code))
。
创建授权操作
通过 Artisan 命令创建新的操作
php artisan authorizator:make-action
此类将出现在 app\Authorizator\Actions
文件夹中。
类必须声明方法 afterAuthorization()
。此方法将在授权成功后调用,例如执行货币转账。通过 getAuthorizationModel()
您可以访问您的 Authorization
模型。最后,您必须定义包含将分配给此操作的代码发送通道类名称的数组 $allowedChannels
,例如。
protected $allowedChannels = [ EmailChannel::class, SmsChannel::class, ];
此外,您可以在$expiresInMinutes
属性中设置代码过期时间(它将存储在数据库中)和在$returnRoute
返回路由(在授权成功后执行)中。如果您想生成自定义代码,则覆盖generateCode()
方法。
注意,如果您的应用实现的User
模型不在App\User
的命名空间中,您可以覆盖AuthorizatorAction::getUser()
方法。
创建视图模板
该包的视图只包含一个带有vue组件的表单
<div class="container"> <div class="row justify-content-center"> <div class="col-md-8"> <div class="card"> <div class="card-header">Authorization</div> <div class="card-body"> <authorizator-form allowed_channels="{{ json_encode($allowedChannels) }}" > You have to verify this action. </authorizator-form> </div> </div> </div> </div> </div>
因此,要在您的应用程序中实现它,您必须将其发布
php artisan vendor:publish --tag=authorizator.views
最后,您可以扩展此视图以用于主模板。别担心,此视图已通过名称初始化在AuthorizatorProvider
中,因此不需要更多操作。
使其工作
最后,我们有了所有必需的元素:投递通道类、操作类、Blade视图和生成的vue组件。现在是设置它们的时候了。
创建一个示例控制器
use App\Services\AuthorizationActions\Transaction; class TransactionController extends Controller { public function create() { return Transaction::createAuth()->response(); } }
让我们分析一下代码。
Transaction
类扩展了Tzm\Authorizator\Service\AuthorizatorAction
类。
在公共控制器的方法create()
中,执行了Transaction::createAuth()
方法。这将向数据库中插入数据并将uuid
设置在会话中。下一个方法通过returnView()
返回默认的Blade视图。就是这样!
现在用户可以看到表单并选择授权代码投递通道。验证后,将执行Transaction
类的afterAuthorization()
方法。
工作示例在此处可用:https://github.com/zmudzinski/authorizator-example
立即发送代码
如果您想创建授权并发送代码(例如控制器)立即(例如控制器)发送,您可以使用AuthorizatorAction
类中的sendCode()
方法。
例如。
VerifyPhoneAction::createAuth()->sendCode(SmsChannel::class)
这将创建授权并通过给定的通道(在这种情况下为SmsChannel
)发送代码
自定义
此包的所有元素都是可定制的。
迁移
您可以通过以下方式覆盖迁移
php artisan vendor:publish --tag=authorizator.migrations
路由
默认情况下,包路由由auth
和web
中间件保护。它们在包routes.php
文件中定义。您可以通过php artisan vendor:publish --tag=authorizator.routes
来覆盖它们。然后您必须在新路由文件中注册新路由。在RouteServiceProvider
类中添加以下方法:
protected function mapAuthorizatorRoutes(){ Route::middleware('web') ->namespace($this->namespace) ->group(base_path('routes/authorizator.php')); }
然后在map()
方法中通过$this->mapAuthorizatorRoutes();
调用它。
public function map() { //... $this->mapAuthorizatorRoutes(); }
接下来,在config/app.php
中,您必须更改providers
数组中的顺序。\Tzm\Authorizator\AuthorizatorProvider::class
必须在App\Providers\RouteServiceProvider::class
之前。
最后,您必须将新端点传递给vue组件的prop
<authorizator-form :allowed-channels='{!! json_encode($allowedChannels) !!}' send-endpoint="/new/path/to/send/code" verify-endpoint="/new/path/to/verify/code" > You have to verify this action. </authorizator-form>
Blade视图
默认Blade视图位于resource\views
文件夹中。您必须发布此视图以将其扩展到主视图
php artisan vendor:publish --tag=authorizator.views
Blade视图使用默认的Bootstrap框架。
返回HTTP代码而不是Blade视图
有时您需要只返回HTTP响应代码而不是Blade视图(例如,如果您正在使用端点生成授权)。为此,将属性$shouldReturnView
添加到您的操作中,并将其设置为false
。这将返回带有代码201
的HTTP响应而不是Blade视图。
vue组件
Vue组件在Blade视图中使用。它负责处理整个授权。您可以使用自己的vue组件。使用
php artisan vendor:publish --tag=authorizator.vue
接下来,您必须更新app.js
中组件的声明。
注意!没有需要使用vue框架。如果您愿意,可以按您想要的方式处理表单。
本地化
所有PHP字符串都是可翻译的。您需要做的只是创建一个位于resource/lang
文件夹中的语言文件,例如pl.json
,内容如下
{ "Code invalid": "Podany kod jest nieprawidłowy" }
如果您想翻译来自AuthorizationForm.vue
的字符串,您可以将翻译后的props传递给组件。
删除过期代码
要删除数据库中的所有过期代码,只需使用Artisan命令
php artisan authorizator:purge
贡献
- 分支它
- 创建您的功能分支:git checkout -b my-new-feature
- 提交您的更改:git commit -am '我的新功能'
- 推送到分支:git push origin my-new-feature
- 提交拉取请求
反馈
如果您有任何问题或问题,请随时联系我们。
许可证
麻省理工学院