fileinvite-org / laravel-url-signer
Laravel中的自定义签名URL
Requires
- league/url: ^3.3
Requires (Dev)
- orchestra/testbench: ~3.4.4|~3.5.0
- phpunit/phpunit: 6.3
README
此包是基于lab66/laravel-url-signer的分支和重新打包版本。这是为了支持Laravel框架6.x及以后的版本,并将其用作FileInvite内部包。
在Laravel中创建有限生命周期的安全URL
此包可以创建有限生命周期的URL。这是通过在URL中添加到期日期和签名来完成的。
需要Laravel 5.3+。
以下是创建有效期为30分钟的签名URL的方法
UrlSigner::sign('https://myapp.com/protected-route', 30);
输出将看起来像这样
https://app.com/protected-route?expires=xxxxxx&signature=xxxxxx
可以使用validate
-函数验证URL。
UrlSigner::validate('https://app.com/protected-route?expires=xxxxxx&signature=xxxxxx');
此包还提供一个中间件来保护路由。
安装
如您所猜测的,此包可以通过Composer安装
composer require fileinvite-org/laravel-url-signer
要启用此包,注册serviceprovider,并可选地注册外观
// config/app.php 'providers' => [ ... Lab66\UrlSigner\UrlSignerServiceProvider::class, ]; 'aliases' => [ ... 'UrlSigner' => Lab66\UrlSigner\UrlSignerFacade::class, ];
配置
配置文件可以通过以下方式可选地发布
php artisan vendor:publish --tag=url-signer
这是文件的包含内容
return [ /* * The private key used to create the signature & sign the url. */ 'private_key' => '-----BEGIN RSA PRIVATE KEY----- MIIBOwIBAAJBAMLEGGPuPfopS53++75op5KaiDba4Lkcl7qjjTA8+W1Y1qzGGM2Z 2zwJ8Uk5alBu47fY63vUClVnGK0ieXviiEkCAwEAAQJAYXJnmagbzkxXDygCoNQP 86Ppvzhn83ZA3Br0i0wWqARJfHWnjiXgfJ+JOIOIngeGKGyd2Y9+6LhT+Ma79ByE 2QIhAOKwTPSCrVQrGj1shT87OuhAuXp5V3YmDGRqx+fVXoELAiEA2/MceDDmIuUn LqOAfbPgbXOife/pFJjaGPrVcxIUmHsCIQCiyADqz+/RcgYst4HTjx/U6a2HMh1J HTdm4HrekoyDUwIgCKYRm4RIuFyMYuAZAFhfXc5rOEqDvsSX5t2OIR035BsCIQCd lf7pXxewNU9ky5sxHuKM4lWSy0BoDHrbyEw/Pigksg== -----END RSA PRIVATE KEY-----', /** * The public key used to verify the signed url signature. */ 'public_key' => '-----BEGIN PUBLIC KEY----- MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAMLEGGPuPfopS53++75op5KaiDba4Lkc l7qjjTA8+W1Y1qzGGM2Z2zwJ8Uk5alBu47fY63vUClVnGK0ieXviiEkCAwEAAQ== -----END PUBLIC KEY-----', /* * The default expiration time of a URL in minutes. */ 'default_expiration' => 60, /* * These strings are used a parameter names in a signed url. */ 'parameters' => [ 'expires' => 'expires', 'signature' => 'signature', ], ];
使用
签名URL
可以使用sign
-方法对URL进行签名
UrlSigner::sign('https://myapp.com/protected-route');
默认情况下,URL的生命期为1小时。此值可以在配置文件中更改。如果您希望自定义生命期,可以指定URL应该有效的分钟数
//the generated URL will be valid for 5 minutes. UrlSigner::sign('https://myapp.com/protected-route', 5);
为了更精细的控制,您也可以传递一个DateTime
实例作为第二个参数。URL将在那个时刻有效。此示例使用Carbon以便于操作
//This URL will be valid up until 2 days from the moment it was generated. UrlSigner::sign('https://myapp.com/protected-route', Carbon::now()->addDays(2) );
验证URL
要验证签名URL,只需调用validate()
-方法。这将返回一个布尔值。
UrlSigner::validate('https://app.com/protected-route?expires=xxxxxx&signature=xxxxxx');
使用中间件保护路由
此包还提供一个中间件来保护路由
Route::get('protected-route', ['middleware' => 'signed-url', function () { return 'Hello secret world!'; }]);
如果未提供有效的签名调用路由,您的应用程序将使用403状态码中止。
重新生成密钥
此包还公开了重新生成配置中密钥的功能,在每次部署后进行此操作可能是个好主意,这将使所有旧的签名URL失效。
php artisan url-signer:generate
在运行此命令之前,您需要发布配置文件。
还有一个可选参数用于密钥的复杂度,根据复杂度,这可能会影响签名/验证的速度。
php artisan url-signer:generate 4096
变更日志
请参阅变更日志以获取更多有关最近更改的信息。
测试
$ vendor/bin/phpunit
Laravel外部的使用
如果您正在处理非Laravel项目,可以使用Spatie的框架无关版本。
贡献
有关详细信息,请参阅贡献。
安全
如果您发现任何安全相关的问题,请通过电子邮件hello@lab66.com或使用问题跟踪器联系。
致谢
关于
此项目起源于https://github.com/spatie/laravel-url-signer,但被重新编写为一个包含所有内容的包,支持OpenSSL的公钥/私钥。
许可证
MIT许可证(MIT)。有关更多信息,请参阅许可证文件。