spiral-packages / signed-urls
在 Spiral 框架中创建和验证签名 URL
1.0.3
2022-06-23 15:35 UTC
Requires
- php: ^8.1
- psr/http-message: ^1.0
- spiral/boot: ^3.0
- spiral/http: ^3.0
- spiral/router: ^3.0
Requires (Dev)
- spiral/framework: ^3.0
- spiral/testing: ^2.0
- vimeo/psalm: ^4.9
This package is auto-updated.
Last update: 2024-09-14 13:45:38 UTC
README
该软件包允许您轻松创建指向命名路由的“签名”URL。这些URL在查询字符串中附加了一个“签名”哈希值,允许 Spiral 框架验证自创建以来该URL是否已被修改。
签名URL对于公开访问但需要防止URL篡改的路由特别有用。
要求
请确保您的服务器已配置以下PHP版本和扩展
- PHP 8.1+
- Spiral 框架 3.0+
安装
您可以通过composer安装该软件包
composer require spiral-packages/signed-urls
在安装软件包后,您需要从软件包中注册引导加载器。
protected const LOAD = [ // ... \Spiral\SignedUrls\Bootloader\SignedUrlsBootloader::class, ];
注意如果您使用
spiral-packages/discoverer
,您无需自行注册引导加载器。
指定环境变量
# Secret key for generating the HMAC variant of the message digest. # REQUIRED SIGNED_URLS_KEY=secret # Name of selected hashing algorithm (i.e. "md5", "sha256", "haval160,4", etc..) # OPTIONAL (sha256 by default) SIGNED_URLS_ALGO=sha256
用法
例如,您可以使用签名URL来实现一个公开的“电子邮件验证”链接,该链接将发送给您的客户
class VerifyEmailNotification { public function __construct( private readonly \Spiral\SignedUrls\UrlGeneratorInterface $urls private readonly \Spiral\Views\ViewInterface $view ) {} public function buildView(): string { return $this->view->render([ 'signed_url' => $this->urls->signedRoute( route: 'verify-email', parameters: ['user_id' => 100] ) ]); } }
如果您希望生成一个在指定时间后过期的临时签名路由URL,您可以在方法中传递过期日期。当 Spiral 框架验证临时签名路由URL时,它将确保编码到签名URL中的过期时间戳尚未过期
class VerifyEmailNotification { public function __construct( private readonly \Spiral\SignedUrls\UrlGeneratorInterface $urls private readonly \Spiral\Views\ViewInterface $view ) {} public function buildView(): string { return $this->view->render([ 'signed_url' => $this->urls->signedRoute( route: 'verify-email', parameters: ['user_id' => 100], expiration: new \DateTime('...') ) ]); } }
您不仅可以对路由进行签名,还可以对URL进行签名
class VerifyEmailNotification { public function __construct( private readonly \Spiral\SignedUrls\UrlGeneratorInterface $urls private readonly \Spiral\Views\ViewInterface $view ) {} public function buildView(): string { return $this->view->render([ 'signed_url' => $this->urls->signedUrl( uri: new \Nyholm\Psr7\Uri('http://site.com/verify-email/?user_id=1'), expiration: new \DateTime('...') ) ]); } }
验证签名URL
要验证URL是否具有有效的签名,应调用 hasValidSignature 方法
class EmailVerificationController { public function __construct( private readonly \Spiral\SignedUrls\UrlGeneratorInterface $urls ) {} public function verify(\Psr\Http\Message\RequestInterface $request): string { if (!$this->urls->hasValidSignature($request->getUri())) { return 'ERROR'; } return 'OK'; } }
您可以将 Spiral\SignedUrls\Middleware\ValidateSignature
中间件分配给路由,而不是使用传入的请求实例来验证签名URL
class EmailVerificationController { public function __construct( private readonly \Spiral\SignedUrls\UrlGeneratorInterface $urls ) {} #[\Spiral\Router\Annotation\Route( name: 'verify-email', route: '...', middleware: \Spiral\SignedUrls\Middleware\ValidateSignature::class )] public function verify(\Psr\Http\Message\RequestInterface $request): string { return 'OK'; } }
测试
composer test
更新日志
请参阅 更新日志 了解最近更改的详细信息。
贡献
请参阅 贡献指南 了解详细信息。
安全漏洞
请审查 我们的安全策略 了解如何报告安全漏洞。
鸣谢
许可
MIT 许可证 (MIT)。请参阅 许可文件 了解更多信息。