emartech / escher
HTTP 请求签名库(PHP 实现)
4.0.0
2024-06-14 13:50 UTC
Requires
- php: >=7.3
- ext-json: *
Requires (Dev)
- phpunit/phpunit: 9.6.19
README
Escher 通过对 HTTP(s) 请求进行签名,帮助您创建安全的 HTTP 请求(用于 API)。它同时是服务器端和客户端实现。目前处于开发中。
算法基于 亚马逊的 AWS Signature Version 4,但我们进行了通用和扩展。
更多详细信息请参考我们的 文档网站。
签名请求
Escher 通过计算请求的加密签名,并将其(及其他认证信息)添加到请求中来工作。通常您会想通过附加额外的头信息来将认证信息添加到请求中。假设您想使用 Guzzle\Http 库向 http://example.com/ 发送一个已签名的 POST 请求
<?php use Escher\Escher; $method = 'POST'; $url = 'http://example.com'; $requestBody = '{ "this_is": "a_request_body" }'; $yourHeaders = array('Content-Type' => 'application/json'); $headersWithAuthInfo = Escher::create('example/credential/scope') ->signRequest('YOUR_ACCESS_KEY_ID', 'YOUR SECRET', $method, $url, $requestBody, $yourHeaders); $client = new \GuzzleHttp\Client(); $response = $client->post($url, array( 'body' => $requestBody, 'headers' => $headersWithAuthInfo ));
预签名 URL
在某些情况下,您可能希望在无法修改请求头的情况下发送认证请求,例如在嵌入 API 生成的 iframe 时。但是,您可以生成一个预签名 URL,其中认证信息被添加到查询字符串中。
<?php use Escher\Escher; $presignedUrl = Escher::create('example/credential/scope') ->presignUrl('YOUR_ACCESS_KEY_ID', 'YOUR SECRET', 'http://example.com');
验证请求
您可以验证使用上述方法签名的请求。为此,您需要一个包含客户端访问密钥和秘密的数据库。Escher 接受任何实现了 ArrayAccess 接口的对象作为密钥数据库。(它也接受纯数组,但不建议将 PHP 数组用于 API 秘密数据库——它只是为了简化测试)
<?php use Escher\Escher; use Escher\Exception; try { $keyDB = new \ArrayObject(array( 'ACCESS_KEY_OF_CLIENT_1' => 'SECRET OF CLIENT 1', 'ACCESS_KEY_OF_CLIENT_42' => 'SECRET OF CLIENT 42', )); Escher::create('example/credential/scope')->authenticate($keyDB); } catch (Exception $ex) { echo 'The validation failed! ' . $ex->getMessage(); }
异常
配置
待定
运行测试
- 使用 Composer 安装包:
composer install
- 使用
make tests
运行测试