twogether / laravel-url-signer
使用公钥/私钥签名和验证URL
Requires
- php: ^7.1|^8.0
- ext-openssl: *
- hidehalo/nanoid-php: ^1.1
Requires (Dev)
- orchestra/testbench: ^8.5
README
使用公钥/私钥签名和验证URL。这是为了使源应用程序能够对目标应用程序进行一次调用,并且目标可以验证它们是合法的。
此包专为Laravel设计,但可以通过一些额外的配置用于其他东西。
安装
首先安装包。如果您使用Laravel,它会添加一个 artisan 命令,您可以使用它来生成密钥对(如果需要的话)。
php artisan twogether:generate-key-pair
您希望将包安装到源和目标中。
如果您不使用Laravel,您将需要生成一个RSA256公钥/私钥对。
配置工厂
如果您使用Laravel,服务提供器将自动注册一个工厂,该工厂使用一个配置文件,该文件发布到config/signed_urls
以存储密钥,并使用Redis外观。app('Twogether\URLSigner')
将返回此实例。
如果您手动配置,那么您需要创建一个工厂。
new Twogether\LaravelURLSigner\SignedUrlFactory(
string $appName,
CacheBroker $cacheBroker,
KeyProvider $keyProvider = null
)
应用程序名称只是一个简短的字符串,用于标识此应用程序。避免使用空格,并保持简单。目标将使用此名称来验证来自此源请求的唯一性,因此您不应重复使用app_names并与同一目标一起使用。
CacheBroker用于验证一次性nonce代码以防止重放攻击。它期望使用Redis进行此操作,并提供PredisCacheBroker类供您使用,通过传递Predis\Client
实例。如果您不使用Redis,或者如果您不使用Predis,则可以检查此类以了解它做什么,并通过在Contracts\CacheBroker
中实现接口来实现自己的。
最后,KeyProvider是可选的。如果您不选择使用它,那么您将必须每次在签名或验证URL时显式设置密钥。我们提供了一个数组实现,您可以进行配置。
new Twogether\LaravelURLSigner\KeyProviders\ArrayKeyProvider([
'default' => [
'public' => '', // Public key string
'private' => '', // Private key string
]
]);
如果不需要,则无需指定公钥和私钥。例如,仅接收请求而不发送请求的目标应用程序不需要私钥。反之亦然。
如果您想使用多个服务对URL进行签名或验证,可以向此数组添加额外的keyName => [pair]
条目。
签名
现在,当您想从源发出请求时,生成您的目标URL,并通过它传递
$factory->sign(string $url, string $keyName = 'default')
这将返回您的签名URL,如果您的配置不正确,则抛出异常。
您还可以调用make
,它返回一个SignedUrl
对象,该对象支持额外的流畅配置。例如:
$factory->make('https://example.com')
->withKey(EXPLICIT PRIVATE KEY HERE)
->withExpiry(time()+300) // 5 minute expiry
->get() // returns the URL as a string
在这里,我们可以显式设置私钥,如果我们没有配置提供程序。我们还可以指定此URL将有效5分钟(默认为2)。
验证
$factory->validate($url,string $keyName = 'default', string $publicKey = '')
将验证签名URL,如果通过则返回true。您可以指定一个keyName以供KeyProvider检索公钥,或者如果更喜欢,可以将密钥作为字符串传递。
如果失败,将抛出InvalidSignedUrl异常,该异常有一个方法
errors(): array
一个验证错误数组,通过字段进行索引,可以与Laravel表单请求一起使用。你可能更喜欢使用中间件。请注意,错误列表并不全面,如果出现问题,将立即报错,并仅包括最后一个错误,除非所有内容都缺失。
开始使用Laravel
要快速开始,发布配置文件,然后在 config/signed_urls
中的 keys.default
设置公开或私有密钥。
现在只需添加
Twogether\LaravelURLSigner\Middleware\SignedURL:class
到中间件栈中。
中间件还支持keyName,如果你想设置路由。在kernel中将中间件别名设置为 signed_urls
,然后指定类似 signed_urls:reporting
的内容来使用配置中分配给'reporting'的公开密钥。
关于密钥的说明
你的公开和私有密钥可以是单行字符串,也可以是每行64字符的版本,带有 -----BEGIN----- 和 -----END-----。库将处理任何一种。