1
|
|
|
<?php |
2
|
|
|
|
3
|
|
|
namespace Chadicus\Psr\Http\ServerMiddleware; |
4
|
|
|
|
5
|
|
|
use ArrayAccess; |
6
|
|
|
use Psr\Http\Message\ServerRequestInterface; |
7
|
|
|
use Psr\Http\Message\ResponseInterface; |
8
|
|
|
|
9
|
|
|
/** |
10
|
|
|
* PSR-7 Middleware for extracting and validating request via hmac cryptography. |
11
|
|
|
*/ |
12
|
|
|
final class Middleware |
13
|
|
|
{ |
14
|
|
|
/** |
15
|
|
|
* Obtains private keys. |
16
|
|
|
* |
17
|
|
|
* @var KeyProviderInterface |
18
|
|
|
*/ |
19
|
|
|
private $keyProvider; |
20
|
|
|
|
21
|
|
|
/** |
22
|
|
|
* Extracts the token information from the incoming request. |
23
|
|
|
* |
24
|
|
|
* @var TokenExtractorInterface |
25
|
|
|
*/ |
26
|
|
|
private $tokenExtractor; |
27
|
|
|
|
28
|
|
|
/** |
29
|
|
|
* Validates the extracted token. |
30
|
|
|
* |
31
|
|
|
* @var TokenValidatorInterface |
32
|
|
|
*/ |
33
|
|
|
private $tokenValidator; |
34
|
|
|
|
35
|
|
|
/** |
36
|
|
|
* Container in which to store the private key. |
37
|
|
|
* |
38
|
|
|
* @var ArrayAccess |
39
|
|
|
*/ |
40
|
|
|
private $container; |
41
|
|
|
|
42
|
|
|
/** |
43
|
|
|
* Construct a new instance of this middleware. |
44
|
|
|
* |
45
|
|
|
* @param KeyProviderInterface $provider Obtains private keys. |
46
|
|
|
* @param TokenExtractorInterface $extractor Extracts the token information from the incoming request. |
47
|
|
|
* @param TokenValidatorInterface $validator Validates the extracted token. |
48
|
|
|
* @param ArrayAccess $container Container in which to store the private key. |
49
|
|
|
*/ |
50
|
|
|
public function __construct( |
51
|
|
|
KeyProviderInterface $provider, |
52
|
|
|
TokenExtractorInterface $extractor, |
53
|
|
|
TokenValidatorInterface $validator, |
54
|
|
|
ArrayAccess $container |
55
|
|
|
) { |
56
|
|
|
$this->keyProvider = $provider; |
57
|
|
|
$this->tokenExtractor = $extractor; |
58
|
|
|
$this->tokenValidator = $validator; |
59
|
|
|
$this->tokenContainer = $container; |
|
|
|
|
60
|
|
|
} |
61
|
|
|
|
62
|
|
|
/** |
63
|
|
|
* Execute this middleware. |
64
|
|
|
* |
65
|
|
|
* @param ServerRequestInterface $request The incoming PSR7 request. |
66
|
|
|
* @param ResponseInterface $response The outgoing PSR7 response. |
67
|
|
|
* @param callable $next The next middleware. |
68
|
|
|
* |
69
|
|
|
* @return ResponseInterface |
70
|
|
|
*/ |
71
|
|
|
public function __invoke(ServerRequestInterface $request, ResponseInterface $response, callable $next) |
72
|
|
|
{ |
73
|
|
|
try { |
74
|
|
|
$token = $this->tokenExtractor->extract($request); |
75
|
|
|
$privateKey = $this->keyProvider->findPrivateKey($token->getPublicKey()); |
76
|
|
|
$this->tokenValidator->validate($privateKey, $token, $request); |
77
|
|
|
|
78
|
|
|
//Authenticated! Set the private key and call the next middleware |
79
|
|
|
$this->tokenContainer['privateKey'] = $privateKey; |
|
|
|
|
80
|
|
|
|
81
|
|
|
return $next($request, $response); |
82
|
|
|
} catch (AuthenticationException $e) { |
83
|
|
|
return $response->withStatus($e->getStatusCode(), $e->getReasonPhrase()); |
84
|
|
|
} |
85
|
|
|
} |
86
|
|
|
} |
87
|
|
|
|
An attempt at access to an undefined property has been detected. This may either be a typographical error or the property has been renamed but there are still references to its old name.
If you really want to allow access to undefined properties, you can define magic methods to allow access. See the php core documentation on Overloading.