salibhdr/typhoon-url-signer

为独立和Laravel创建和验证签名的安全URL

v1.2.1.1 2020-07-04 08:56 UTC

This package is auto-updated.

Last update: 2024-09-14 19:25:58 UTC


README

Salibhdr|typhoon

Total Downloads Latest Stable Version Latest Unstable Version License

介绍

Typhoon Url Signer是一个易于签名的URL验证包。您可以创建安全的文件URL和任何类型的URL,以便未经许可的人无法访问。您可以通过设置有限的生命周期来使URL过期。

您可以使用此包作为独立版本以及与您的Laravel应用程序一起使用

功能

  • 创建带过期时间的安全URL
  • 创建不带过期时间的安全URL
  • 验证URL
  • 与Laravel和独立版本都使用
  • 使用您的逻辑(md5,Hmac等)添加您的签名者(独立模式)
  • 使用您的逻辑添加您的URL签名者(独立模式)
  • 添加您的签名(Laravel和独立版本)

安装

使用Composer安装

 $ composer require salibhdr/typhoon-url-signer

入门

独立版本

您已准备好使用此包,无需其他配置。

Laravel和lumen

Laravel

在config/app.php配置文件中注册UrlSignerServiceProvider

'providers' => [

     // Other service providers...
     
     SaliBhdr\UrlSigner\Laravel\ServiceProviders\UrlSignerServiceProvider::class,
],

运行vendor:publish命令

php artisan vendor:publish --provider="SaliBhdr\UrlSigner\Laravel\ServiceProviders\UrlSignerServiceProvider"

它将在config目录下生成urlSigner.php

URL_SIGN_KEY复制到您的env

URL_SIGN_KEY=

运行urlSigner:generate命令以生成一个signKey

php artisan urlSigner:generate

它将在.env文件中生成一个签名密钥。

Lumen

在bootstrap/app.php中注册UrlSignerServiceProvider

$app->register(SaliBhdr\UrlSigner\Laravel\ServiceProviders\UrlSignerServiceProvider::class);

将包配置文件复制到config目录(您可能需要创建一个)

URL_SIGN_KEY复制到您的env

URL_SIGN_KEY=

运行urlSigner:generate命令以生成一个signKey

php artisan urlSigner:generate

它将在.env文件中生成一个签名密钥。

使用方法

一般描述

您有三种方式可以签名URL

  1. 使用Md5签名者
  2. 使用Hmac签名者
  3. 使用基本签名者

上述所有三个签名者都已实现SaliBhdr\UrlSigner\UrlSignerInterface并具有三个方法

  1. create($url,$params) : 基于输入创建签名URL
  2. validate($url,$params) : 验证签名URL,根据输入抛出异常
  3. isValid($url,$params) : 验证并返回true/false而不是异常

所有三个方法签名方法接受两个输入参数。$url参数和$params。您可以传递带有查询字符串附加的URL

<?php
$url = 'www.example.com/api/v1/book?timestamp=153664546&id=2';


$signedUrl = $urlSigner->create($url);

或者您可以分别传递URL和查询

<?php
$url = 'www.example.com/api/v1/book';

$params = [
    'timestamp' => '153664546',
    'id' => 2
];

$signedUrl = $urlSigner->create($url,$params);

所以请注意这三个方法中。

请随意通过实现UrlSignerInterface创建您自己的签名者。

URL签名者的默认TTL为7200秒(2小时)。传递null到TTL,以便URL永远不会过期。

独立版本

使用Md5签名者

创建Md5UrlSigner的实例

<?php

use SaliBhdr\UrlSigner\Md5UrlSigner;

//your sign key
$signKey = 'EKtF4lFP6D1FjBGtSRIk1gGn2YCRmtGPocBWV39wAeM=';
// default ttl is 7200 seconds
// pass null to make url's without expire time
$ttl = 7200; 

$urlSigner = new Md5UrlSigner($signKey,$ttl);

使用HmacUrlSigner签名者

创建HmacUrlSigner的实例

<?php

use SaliBhdr\UrlSigner\HmacUrlSigner;

//your sign key
$signKey = 'EKtF4lFP6D1FjBGtSRIk1gGn2YCRmtGPocBWV39wAeM=';
$algorithm = 'sha1';
// default ttl is 7200 seconds
// pass null to make url's without expire time
$ttl = 7200; 

$urlSigner = new HmacUrlSigner($signKey,$algorithm,$ttl);

HmacUrlSigner通过第二个参数获取算法。默认哈希算法是sha256。如果您想传递除了sha256之外的其他算法,请传递第二个参数。您可以在这里看到所有可用的算法列表

使用基本UrlSigner签名者

URL签名者生态系统基于三个主要类

  1. 签名者:是哈希方法类
  2. 签名:是主要的类,根据签名者签名URL
  3. urlSigner:是使用签名来创建和验证URL的类

根据上面的描述,您必须定义所有3个参数,以使基本URL签名器正常工作。这样,您就可以自由地使用任何签名器和签名来创建URL,只要为签名器实现SignerInterface,为签名实现SignatureInterface

首先创建一个签名器

您可以使用本包内置的3个签名器之一。

  1. SaliBhdr\UrlSigner\Signers\Md5
  2. SaliBhdr\UrlSigner\Signers\Hmac
  3. SaliBhdr\UrlSigner\Signers\Rsa
<?php

use SaliBhdr\UrlSigner\Signers\Md5;
use SaliBhdr\UrlSigner\Signers\Hmac;
use SaliBhdr\UrlSigner\Signers\Rsa;
use phpseclib\Crypt\RSA as BaseRSA;

//-------------Md5 signer example-------------
//your sign key
$signKey = 'EKtF4lFP6D1FjBGtSRIk1gGn2YCRmtGPocBWV39wAeM=';

$signer = new Md5($signKey);

//-------------Hmac signer example------------

$signer = new Hmac($signKey);

//-------------Rsa signer example-------------

/* Rsa needs 2 extra parameters
 * a public_key and a private_key
 * It will not work if you don't provide these two
 */
$algorithm = 'sha1'; // default is sha256
$signMode = BaseRSA::SIGNATURE_PKCS1;

$signer = new Rsa($algorithm,$signMode);

$signer->setPublicKey('----RSA PUBLIC KEY HERE----');
$signer->setPrivateKey('----RSA PRIVATE KEY HERE----');

其次创建一个签名并将签名器指向路径

<?php

use SaliBhdr\UrlSigner\Signatures\Signature;

// default ttl is 7200 seconds
// pass null to make url's without expire time
$ttl = 7200; 

$signature = new Signature($signer,$ttl);

最后一步创建UrlSigner并将签名指向路径

<?php

use SaliBhdr\UrlSigner\UrlSigner;

$urlSigner = new UrlSigner($signature);

现在您可以使用URL签名器

创建签名URL

<?php

$url = 'www.example.com/api/v1/book';

$params = [
    'timestamp' => '153664546',
    'id' => 2
];

$signedUrl = $urlSigner->create($url,$params);

验证签名URL

<?php

// throws exception
$urlSigner->validate($signedUrl);

// returns true/false
echo $urlSigner->isValid($signedUrl) ? 'valid' : 'notValid';

validate()方法将抛出以下两个错误之一

  1. SignatureMissingException:如果URL中没有sg参数
  2. SignatureNotValidException:如果sg参数不是一个有效的参数
  3. SignatureTimestampMissingException:如果URL中没有ts参数
  4. SignatureUrlExpiredException:如果链接已过期

注意1:如果您想处理异常,所有异常都是从UrlSignerException扩展而来的注意2:当您定义了ttl(生存时间)时,Url过期和缺少时间戳异常将被抛出

Laravel

注意:请阅读上面的独立部分以了解有关方法的详细信息。

URL签名器的默认ttl是7200秒(2小时)。在配置中将ttl设置为null,以便URL永远不会过期。

您可以使用UrlSigner外观来签名和验证URL。

<?php

use UrlSigner;

$url = 'www.example.com/api/v1/book?timestamp=153664546&id=2';

$signedUrl = UrlSigner::create($url);

或者您可以分别传递URL和查询

<?php
use SaliBhdr\UrlSigner\Laravel\Facades\UrlSigner;

$url = 'www.example.com/api/v1/book';

$params = [
    'timestamp' => '153664546',
    'id' => 2
];

$signedUrl = UrlSigner::create($url, $params);

要验证URL

<?php

//throws exception
UrlSigner::validate($signedUrl);

// returns true/false
echo UrlSigner::isValid($signedUrl) ? 'valid':'notValid';

待办事项

  • 编写测试

问题

您可以在github存储库中报告问题这里

许可证

Typhoon-Url-Signer是在MIT许可证下发布的。

用❤为您构建。

免费软件,太棒了!

贡献

贡献、有用的评论和反馈非常受欢迎!