HTTP请求签名的库(PHP实现)
1.2.1
2018-12-13 16:26 UTC
Requires
- php: >5.3
Requires (Dev)
- phpunit/phpunit: 3.7.*
README
Escher帮助您通过签名HTTP(s)请求来创建安全的HTTP请求(用于API)。它同时是服务器端和客户端的实现。目前处于开发中。
该算法基于亚马逊的AWS签名版本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(); }
异常
配置
待定