salibhdr/typhoon-url-signer
为独立和Laravel创建和验证签名的安全URL
Requires
- php: >=7.0.0
- phpseclib/phpseclib: ~2.0
This package is auto-updated.
Last update: 2024-09-14 19:25:58 UTC
README
介绍
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
- 使用Md5签名者
- 使用Hmac签名者
- 使用基本签名者
上述所有三个签名者都已实现SaliBhdr\UrlSigner\UrlSignerInterface
并具有三个方法
- create($url,$params) : 基于输入创建签名URL
- validate($url,$params) : 验证签名URL,根据输入抛出异常
- 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签名者生态系统基于三个主要类
- 签名者:是哈希方法类
- 签名:是主要的类,根据签名者签名URL
- urlSigner:是使用签名来创建和验证URL的类
根据上面的描述,您必须定义所有3个参数,以使基本URL签名器正常工作。这样,您就可以自由地使用任何签名器和签名来创建URL,只要为签名器实现SignerInterface
,为签名实现SignatureInterface
。
首先创建一个签名器
您可以使用本包内置的3个签名器之一。
- SaliBhdr\UrlSigner\Signers\Md5
- SaliBhdr\UrlSigner\Signers\Hmac
- 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()方法将抛出以下两个错误之一
- SignatureMissingException:如果URL中没有
sg
参数 - SignatureNotValidException:如果
sg
参数不是一个有效的参数 - SignatureTimestampMissingException:如果URL中没有
ts
参数 - 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许可证下发布的。
用❤为您构建。
免费软件,太棒了!
贡献
贡献、有用的评论和反馈非常受欢迎!