fileinvite-org/laravel-url-signer

Laravel中的自定义签名URL

4.0.1 2022-01-11 00:21 UTC

This package is auto-updated.

Last update: 2024-09-12 05:18:23 UTC


README

此包是基于lab66/laravel-url-signer的分支和重新打包版本。这是为了支持Laravel框架6.x及以后的版本,并将其用作FileInvite内部包。

在Laravel中创建有限生命周期的安全URL

Latest Version on Packagist Build Status Quality Score SensioLabsInsight StyleCI Total Downloads

此包可以创建有限生命周期的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)。有关更多信息,请参阅许可证文件