linkeys / signed-url
增强Laravel的签名URL,包括附加数据、点击限制和过期时间。
Requires
- php: ^8.0
- laravel/framework: ^9.0|^10.0
- nesbot/carbon: ^2.17
- ramsey/uuid: ^4.0
- spatie/url: ^2.0
Requires (Dev)
- laravel/legacy-factories: ^1.0
- orchestra/testbench: ^7.0|^8.0
- phpspec/prophecy-phpunit: ^2.0
- phpunit/phpunit: ^9.0
This package is auto-updated.
Last update: 2024-09-19 13:00:34 UTC
README
增强Laravel的签名URL,包括附加数据、点击限制和过期时间。
目录
简介
重新设计的URL签名引入Laravel。通过任何URL安全地传递数据,并控制过期和点击次数。
- 安全地将数据附加到链接,使其对控制器可用。
- 创建有限生命周期的链接。
- 限制链接的点击次数。
- 限制一组链接的点击次数,例如,仅允许一组链接中的一个被点击。
版本兼容性
入门
在您的Laravel应用程序中安装和设置URL签名非常简单。
安装
-
通过Composer包管理器安装
composer require linkeys/signed-url
-
(可选)发布资源
php artisan vendor:publish --provider="Linkeys\UrlSigner\Providers\UrlSignerServiceProvider"
您还可以使用
--tag=config
或--tag=migrations
标志仅发布配置文件或迁移。 -
运行迁移
php artisan migrate
使用
概述
此包通过修改URL以提供签名来工作。这必须是您在路由中注册的URL。当在浏览器中打开签名URL时,我们的中间件不仅会将附加的数据注入到控制器请求中,如果在任何方式上链接已过期、被点击次数过多或被更改,则将抛出异常。
创建链接
标准链接
创建链接的最简单方法是使用外观
$link = \Linkeys\UrlSigner\Facade\UrlSigner::generate('https://www.example.com/invitation'); echo $link->getFullUrl(); // https://www.example.com/invitation?uuid=UUID
现在可以像普通签名URL一样发送或使用该链接。您还可以使用sign方法,它只是generate的别名,并且使用别名而不是导入完整的外观命名空间
$link = UrlSigner::sign('https://www.example.com/invitation');
您还可以从容器中解析出 \Linkeys\UrlSigner\Contracts\UrlSigner
实例,并直接调用外观函数。
数据
您不必自己将数据编码到URL中,只需将其作为第二个参数传递。
$link = \Linkeys\UrlSigner\Facade\UrlSigner::generate('https://www.example.com/invitation', ['foo' => 'bar']); echo $link->getFullUrl(); // https://www.example.com/invitation?uuid=UUID
例如,在控制器中,例如,InvitationController.php
echo $request->get('foo'); // bar
通过此方法,数据不能被任何人更改,甚至用户也无法看到,这保护了您的应用程序并隐藏了实现细节。
过期时间
除了基本链接外,您还可以设置链接的过期时间。只想让链接可用24小时?
$link = \Linkeys\UrlSigner\Facade\UrlSigner::generate('https://www.example.com/invitation', ['foo' => 'bar'], '+24 hours');
过期时间接受字符串、Unix时间戳或datetime实例(即Carbon)。
点击限制
您还可以设置链接的点击次数。如果您只想允许用户点击一次链接
$link = \Linkeys\UrlSigner\Facade\UrlSigner::generate('https://www.example.com/invitation', ['foo' => 'bar'], '+24 hours', 1);
第一次点击链接时,路由将像正常一样工作。第二次,由于链接只有一个点击,将抛出异常。当然,将 null
而不是 +24 hours
传递给过期参数将创建无限生命周期的链接。
链接组
通过分组链接,点击限制可以跨多个链接分配。给定一个点击限制为2但包含3个链接的组,将允许总共点击两次。除非它们自己指定,否则过期时间默认适用于链接。
$group = \Linkeys\UrlSigner\Facade\UrlSigner::group(function($links) { $links->generate('https://www.example.com', ['foo'=>'bar']), $links->generate('https://www.example.com', ['foo'=>'baz']) }, '+ 24 hours', 1)'
这将创建两个链接,两者具有不同的数据并将在24小时后过期,但由于组点击限制为1,因此只能点击一个链接。这在您想给用户提供选择链接点击的情况很有用,例如用于邀请(用户应该只能点击'是'或'否'来回复)。
组中的过期参数是应用于所有没有过期日期的组链接的默认值。如果您在链接中设置过期日期,并且在组中设置,则只检查链接的过期日期。
您可以使用$group->links;
访问链接,它将返回一个Laravel集合。
处理链接
中间件
为了在链接无效时抛出异常,只需将'link'
中间件添加到任何相关路由即可。这将处理以下情况:
- 确保URL没有被更改。
- 检查链接是否已过期。
- 检查链接是否已达到点击次数限制。
- 将链接和相关数据添加到请求中。
检索链接信息
我们自动将附加到链接的所有数据放入请求属性中。以下是一个当用户点击带有数据的生成链接时调用的控制器方法。
public function acceptInvitation(Request $request) { // Given the link has the data ['foo' => 'bar']... $bar = $request->get('foo'); // To retrieve the link instance: $link = $request->get(\Linkeys\UrlSigner\Models\Link::class); var_dump($link->data) // ['foo' => 'bar'] }
错误处理
当链接在任何方面无效时,中间件将抛出异常。默认情况下,这些异常将由Laravel处理,显示一个带有简单消息的错误页面。
通过使用您的应用程序的异常处理器,您可以通过捕获错误并返回响应来选择显示自定义页面以响应以下每种情况。
通过使用异常继承,您可以根据异常类型控制显示哪些页面,或者为所有链接异常只显示一个页面。下面的继承图显示了所有类都在命名空间\Linkeys\UrlSigner\Exceptions
中,除了\Exception
。
示例
即将推出...
贡献
贡献使得开源社区成为一个如此美妙的学习、启发和创造的地方。您所做的任何贡献都受到strongly appreciated
。有关更多信息,请参阅CONTRIBUTING.md
。
-
分支项目
-
创建您的功能分支(
git checkout -b feature/AmazingFeature
) -
提交您的更改(
git commit -m 'Add some AmazingFeature'
) -
推送到分支(
git push origin feature/AmazingFeature
) -
打开一个pull request
许可
在MIT许可下分发。有关更多信息,请参阅LICENSE
。
联系方式
Toby Twigger - toby@linkeys.app