HTTP请求签名的库(PHP实现)

1.2.1 2018-12-13 16:26 UTC

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();
}

异常

配置

待定