mcordingley / laravel-sapient
Laravel 的 Sapient 集成
Requires
- illuminate/console: ^5.4|^6.0
- illuminate/contracts: ^5.4|^6.0
- illuminate/http: ^5.4|^6.0
- illuminate/support: ^5.4|^6.0
- paragonie/constant_time_encoding: ^2.0
- paragonie/sapient: ^1.0.0
- paragonie/sodium_compat: ^1.0
- symfony/psr-http-message-bridge: ^1.0
- zendframework/zend-diactoros: ^1.4
Requires (Dev)
- laravel/framework: ^5.4|^6.0
- phpunit/phpunit: ^6.2
README
Sapient 兼容的 Laravel 绑定。
安装
使用 composer 安装 composer require mcordingley/laravel-sapient,然后将 MCordingley\LaravelSapient\SapientServiceProvider::class 添加到您的 app.php 配置文件中。然后,使用 php artisan vendor:publish 发布配置文件。发布配置后,您需要为您打算使用的函数生成密钥。
生成密钥
为了密封响应和解封请求,运行 php artisan sapient:generate:seal:pair。使用共享密钥进行签名和验证需要 php artisan sapient:generate:shared:authentication。运行 php artisan sapient:generate:shared:encryption 生成用于加密和解密的共享密钥。最后,运行 php artisan sapient:generate:sign:pair 将为签名响应和验证请求创建密钥。
使用中间件
此库公开了执行各种功能的中间件,但没有规定它们应该放在哪里。您需要将它们放在您自己的项目中意义最重大的地方。中间件可以放置的位置有一些限制。
SharedVerifyRequest 和 VerifyRequest 应尽可能早地运行,在处理传入请求之前。如果请求头中没有包含消息身份验证码 (MAC) 或包含无效的 MAC,这些将终止请求。
SharedDecryptRequest 和 UnsealRequest 应在验证 MAC 的中间件之后运行,但在处理请求体内容之前。
SharedEncryptResponse 和 SealResponse 应作为最后一个修改请求体的中间件运行,因为这些将锁定体内容。
SharedAuthenticateResponse 和 SignResponse 应仅在响应体修改完成后运行。这包括在此处执行加密的任何中间件。否则,它们的签名将是无效的。它们将为响应添加一个包含响应体 MAC 的标题。
具有额外要求的中间件
VerifyRequest 和 SealResponse 依赖于发出请求的客户端的公钥。由于所需密钥及其存储位置可能不同,这些中间件不能直接从 Laravel 的容器中解析所需的密钥。您将必须提供返回适当公钥的逻辑。
创建一个实现 MCordingley\LaravelSapient\KeyResolver\Resolver 的实例,并将其注册到 Laravel 的容器中,使用上下文绑定。在您的某个服务提供者中,这看起来可能像
$this->app->when(MCordingley\LaravelSapient\Middleware\VerifyRequest::class)
->needs(MCordingley\LaravelSapient\KeyResolver\Resolver::class)
->give(Your\Implementation::class);
UserResolver被提供以处理常见情况,即键直接存储在进入请求的User对象中。只需提供存储键的属性名称并将其注册到Laravel的容器中即可。例如
$this->app->when(MCordingley\LaravelSapient\Middleware\SealResponse::class)
->needs(MCordingley\LaravelSapient\KeyResolver\Resolver::class)
->give(function () {
return new MCordingley\LaravelSapient\KeyResolver\UserResolver('sealing_public_key');
});
还提供了StaticResolver。它将解析传递给其构造函数的任何键。它主要存在于测试目的,但在特定情况下可能有用,或者如果您想将键解析逻辑直接放入您的服务提供者中。
使用Sapient存储的键
如果您的项目还使用Sapient创建对其他服务器的请求并处理它们的响应,您可以使用并应该使用您生成的键。只需使用Laravel的容器来解析Sapient的加密密钥对象。它们将加载您配置中的键。