lab66 / laravel-url-signer
Laravel中的自定义签名URL
Requires
- php: ^7.0
- illuminate/http: ^5.3.0
- illuminate/support: ^5.3.0
- league/url: ^3.3
Requires (Dev)
- orchestra/testbench: ~3.4.4|~3.5.0
- phpunit/phpunit: 6.3
README
本包可以创建有限生命周期的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 lab66/laravel-url-signer
要启用该包,请注册服务提供者,并可选地注册外观
// 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)。有关更多信息,请参阅许可证文件。