Skip to content

Commit

Permalink
add HttPlug support
Browse files Browse the repository at this point in the history
  • Loading branch information
IonBazan committed Apr 29, 2020
1 parent dfd3d50 commit 6ef153a
Show file tree
Hide file tree
Showing 4 changed files with 94 additions and 5 deletions.
31 changes: 30 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,12 @@
[![GitHub Workflow Status](https://img.shields.io/github/workflow/status/IonBazan/aliyun-http-signer/Tests)](https://github.com/IonBazan/aliyun-http-signer/actions)
[![PHP version](https://img.shields.io/packagist/php-v/ion-bazan/aliyun-http-signer.svg)](https://packagist.org/packages/ion-bazan/aliyun-http-signer)
[![Codecov](https://img.shields.io/codecov/c/gh/IonBazan/aliyun-http-signer)](https://codecov.io/gh/IonBazan/aliyun-http-signer)
[![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/IonBazan/aliyun-http-signer/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/IonBazan/aliyun-http-signer/?branch=master)
[![Downloads](https://img.shields.io/packagist/dt/ion-bazan/aliyun-http-signer.svg)](https://packagist.org/packages/ion-bazan/aliyun-http-signer)
[![License](https://img.shields.io/packagist/l/ion-bazan/aliyun-http-signer.svg)](https://packagist.org/packages/ion-bazan/aliyun-http-signer)

This library implements [Alibaba Cloud API Gateway request signature](https://www.alibabacloud.com/help/doc-detail/29475.htm) calculation for [PSR-7](https://www.php-fig.org/psr/psr-7/) compatible requests.
It integrates with [Guzzle](https://github.com/guzzle/guzzle) by providing a simple [Middleware](http://docs.guzzlephp.org/en/stable/handlers-and-middleware.html#middleware) but can be used with any PSR-7-compatible client.
It integrates with [Guzzle](https://github.com/guzzle/guzzle) and [HttPlug](https://github.com/php-http/httplug) but can be used with any PSR-7-compatible client.

# Installation
Use [Composer](https://getcomposer.org/) to install the package using:
Expand Down Expand Up @@ -70,6 +71,34 @@ $client = new Client(['handler' => $stack]);
$response = $client->get('https://example.com/api/v1/test');
```

## Sign an API request using HttPlug plugin

```php
<?php

require_once 'vendor/autoload.php';

use Http\Client\Common\PluginClient;
use Http\Discovery\HttpClientDiscovery;
use IonBazan\AliyunSigner\Key;
use IonBazan\AliyunSigner\RequestSigner;
use IonBazan\AliyunSigner\HttPlug\RequestSignerPlugin;

// Provide credentials
$appId = '12345678';
$secret = base64_encode('secret');

// Create signer and plugin
$signer = new RequestSigner(new Key($appId, $secret));
$plugin = new RequestSignerPlugin($signer);
$pluginClient = new PluginClient(
HttpClientDiscovery::find(),
[$plugin]
);

$pluginClient->sendRequest($request);
```

# Bugs & issues

If you found a bug or security vulnerability, please [open an issue](https://github.com/IonBazan/aliyun-http-signer/issues/new)
Expand Down
10 changes: 6 additions & 4 deletions composer.json
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
{
"name": "ion-bazan/aliyun-http-signer",
"type": "library",
"description": "PSR-7-compatible Alibaba Cloud API Gateway request signing implementation. Integrates with Guzzle ⛽️.",
"keywords": ["Aliyun", "Alibaba", "Alibaba Cloud", "API Gateway", "Guzzle", "PSR-7", "HMAC", "Signature"],
"description": "PSR-7-compatible Alibaba Cloud API Gateway request signing implementation. Integrates with Guzzle ⛽️ and HttPlug \uD83D\uDC18.",
"keywords": ["Aliyun", "Alibaba", "Alibaba Cloud", "API Gateway", "Guzzle", "PSR-7", "HMAC", "Signature", "httplug", "http"],
"homepage": "https://github.com/IonBazan/aliyun-http-signer",
"license": "MIT",
"authors": [
Expand All @@ -23,11 +23,13 @@
"friendsofphp/php-cs-fixer": "^2.16",
"guzzlehttp/guzzle": "^6.0|^7.0",
"laminas/laminas-diactoros": "^2.2",
"php-http/client-common": "^2.0",
"phpunit/phpunit": "^8.0|^9.0"
},
"suggest": {
"guzzlehttp/guzzle": "^6.0|^7.0",
"laminas/laminas-diactoros": "^2.2"
"guzzlehttp/guzzle": "^6.0|^7.0, to use Guzzle Middleware",
"laminas/laminas-diactoros": "^2.2, to build HTTP requests",
"php-http/client-common": "^2.0, to use HttPlug plugin"
},
"autoload": {
"psr-4": {
Expand Down
26 changes: 26 additions & 0 deletions src/HttPlug/RequestSignerPlugin.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
<?php

namespace IonBazan\AliyunSigner\HttPlug;

use Http\Client\Common\Plugin;
use Http\Promise\Promise;
use IonBazan\AliyunSigner\RequestSigner;
use Psr\Http\Message\RequestInterface;

class RequestSignerPlugin implements Plugin
{
/** @var RequestSigner */
protected $requestSigner;

public function __construct(RequestSigner $requestSigner)
{
$this->requestSigner = $requestSigner;
}

public function handleRequest(RequestInterface $request, callable $next, callable $first): Promise
{
$request = $this->requestSigner->signRequest($request);

return $next($request);
}
}
32 changes: 32 additions & 0 deletions tests/HttPlug/RequestSignerPluginTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
<?php

namespace IonBazan\AliyunSigner\Tests\HttPlug;

use Http\Client\Promise\HttpFulfilledPromise;
use Http\Promise\Promise;
use IonBazan\AliyunSigner\HttPlug\RequestSignerPlugin;
use IonBazan\AliyunSigner\RequestSigner;
use PHPUnit\Framework\TestCase;
use Psr\Http\Message\RequestInterface;
use Psr\Http\Message\ResponseInterface;

class RequestSignerPluginTest extends TestCase
{
public function testPluginCallsSigner(): void
{
$signer = $this->createMock(RequestSigner::class);
$plugin = new RequestSignerPlugin($signer);
$verify = function (RequestInterface $request): Promise {
return new HttpFulfilledPromise(
$this->createMock(ResponseInterface::class)
);
};

$request = $this->createMock(RequestInterface::class);
$signer->expects($this->once())
->method('signRequest')
->with($request);

$plugin->handleRequest($request, $verify, $verify);
}
}

0 comments on commit 6ef153a

Please sign in to comment.