emartech/escher

HTTP 请求签名库(PHP 实现)

4.0.0 2024-06-14 13:50 UTC

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

异常

配置

待定

运行测试

  1. 使用 Composer 安装包: composer install
  2. 使用 make tests 运行测试