Skip to content

Commit dfaf578

Browse files
committed
Access token middleware for authentication
1 parent e81983f commit dfaf578

File tree

2 files changed

+98
-0
lines changed

2 files changed

+98
-0
lines changed
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace ApiClients\Client\Scrutinizer\Middleware;
6+
7+
use ApiClients\Foundation\Middleware\ErrorTrait;
8+
use ApiClients\Foundation\Middleware\MiddlewareInterface;
9+
use ApiClients\Foundation\Middleware\PostTrait;
10+
use Psr\Http\Message\RequestInterface;
11+
use React\Promise\CancellablePromiseInterface;
12+
use function React\Promise\resolve;
13+
use function RingCentral\Psr7\build_query;
14+
use function RingCentral\Psr7\parse_query;
15+
16+
final class AccessTokenMiddleware implements MiddlewareInterface
17+
{
18+
const OPTION_ACCESS_TOKEN = 'ACCESS_TOKEN';
19+
20+
use PostTrait;
21+
use ErrorTrait;
22+
23+
public function pre(
24+
RequestInterface $request,
25+
string $transactionId,
26+
array $options = []
27+
): CancellablePromiseInterface {
28+
if (!isset($options[self::class][self::OPTION_ACCESS_TOKEN])) {
29+
return resolve($request);
30+
}
31+
32+
$query = parse_query($request->getUri()->getQuery());
33+
$query['access_token'] = $options[self::class][self::OPTION_ACCESS_TOKEN];
34+
$request = $request->withUri($request->getUri()->withQuery(build_query($query)));
35+
return resolve($request);
36+
}
37+
}
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
<?php declare(strict_types=1);
2+
3+
namespace ApiClients\Tests\Client\Scrutinizer;
4+
5+
use ApiClients\Client\Scrutinizer\Middleware\AccessTokenMiddleware;
6+
use ApiClients\Tools\TestUtilities\TestCase;
7+
use React\EventLoop\Factory;
8+
use RingCentral\Psr7\Request;
9+
10+
final class AccessTokenMiddlewareTest extends TestCase
11+
{
12+
public function testNoOption()
13+
{
14+
$request = new Request('GET', 'https://example.com/');
15+
16+
$middleware = new AccessTokenMiddleware();
17+
$returnedRequest = $this->await($middleware->pre($request, 'abc'), Factory::create());
18+
19+
self::assertSame($request, $returnedRequest);
20+
}
21+
22+
public function testAddedTokenFirst()
23+
{
24+
$request = new Request('GET', 'https://example.com/');
25+
26+
$middleware = new AccessTokenMiddleware();
27+
$promise = $middleware->pre(
28+
$request,
29+
'abc',
30+
[
31+
AccessTokenMiddleware::class => [
32+
AccessTokenMiddleware::OPTION_ACCESS_TOKEN => 'token',
33+
],
34+
]
35+
);
36+
$returnedRequest = $this->await($promise, Factory::create());
37+
38+
self::assertNotSame($request, $returnedRequest);
39+
self::assertSame('https://example.com/?access_token=token', (string)$returnedRequest->getUri());
40+
}
41+
42+
public function testAddedTokenSecond()
43+
{
44+
$request = new Request('GET', 'https://example.com/?first=value');
45+
46+
$middleware = new AccessTokenMiddleware();
47+
$promise = $middleware->pre(
48+
$request,
49+
'abc',
50+
[
51+
AccessTokenMiddleware::class => [
52+
AccessTokenMiddleware::OPTION_ACCESS_TOKEN => 'token',
53+
],
54+
]
55+
);
56+
$returnedRequest = $this->await($promise, Factory::create());
57+
58+
self::assertNotSame($request, $returnedRequest);
59+
self::assertSame('https://example.com/?first=value&access_token=token', (string)$returnedRequest->getUri());
60+
}
61+
}

0 commit comments

Comments
 (0)