1 | <?php |
||
2 | |||
3 | declare(strict_types=1); |
||
4 | |||
5 | namespace TMV\OpenIdClient\Claims; |
||
6 | |||
7 | use function array_filter; |
||
8 | use Http\Discovery\Psr17FactoryDiscovery; |
||
9 | use Http\Discovery\Psr18ClientDiscovery; |
||
10 | use function is_array; |
||
11 | use Jose\Component\Core\AlgorithmManager; |
||
12 | use Jose\Component\Signature\JWSVerifier; |
||
13 | use Jose\Component\Signature\Serializer\JWSSerializer; |
||
14 | use Psr\Http\Client\ClientInterface; |
||
15 | use Psr\Http\Message\RequestFactoryInterface; |
||
16 | use Psr\Http\Message\ResponseInterface; |
||
17 | use Throwable; |
||
18 | use function TMV\OpenIdClient\check_server_response; |
||
19 | use TMV\OpenIdClient\Client\ClientInterface as OpenIDClient; |
||
20 | use TMV\OpenIdClient\Issuer\IssuerFactoryInterface; |
||
21 | |||
22 | final class DistributedParser extends AbstractClaims implements DistributedParserInterface |
||
23 | { |
||
24 | /** @var ClientInterface */ |
||
25 | private $client; |
||
26 | |||
27 | /** @var RequestFactoryInterface */ |
||
28 | private $requestFactory; |
||
29 | |||
30 | 4 | public function __construct( |
|
31 | ?ClientInterface $client = null, |
||
32 | ?RequestFactoryInterface $requestFactory = null, |
||
33 | ?AlgorithmManager $algorithmManager = null, |
||
34 | ?JWSVerifier $JWSVerifier = null, |
||
35 | ?IssuerFactoryInterface $issuerFactory = null, |
||
36 | ?JWSSerializer $serializer = null |
||
37 | ) { |
||
38 | 4 | parent::__construct($algorithmManager, $JWSVerifier, $issuerFactory, $serializer); |
|
39 | |||
40 | 4 | $this->client = $client ?: Psr18ClientDiscovery::find(); |
|
41 | 4 | $this->requestFactory = $requestFactory ?: Psr17FactoryDiscovery::findRequestFactory(); |
|
42 | 4 | } |
|
43 | |||
44 | 4 | public function fetch(OpenIDClient $client, array $claims, array $accessTokens = []): array |
|
45 | { |
||
46 | 4 | $claimSources = $claims['_claim_sources'] ?? null; |
|
47 | 4 | $claimNames = $claims['_claim_names'] ?? null; |
|
48 | |||
49 | 4 | if (! is_array($claimSources)) { |
|
50 | 1 | return $claims; |
|
51 | } |
||
52 | |||
53 | 3 | if (! is_array($claimNames)) { |
|
54 | 1 | return $claims; |
|
55 | } |
||
56 | |||
57 | $distributedSources = array_filter($claimSources, static function ($value) { |
||
58 | 2 | return null !== ($value['endpoint'] ?? null); |
|
59 | 2 | }); |
|
60 | |||
61 | /** @var ResponseInterface[] $responses */ |
||
62 | 2 | $responses = []; |
|
63 | 2 | foreach ($distributedSources as $sourceName => $source) { |
|
64 | 2 | $request = $this->requestFactory->createRequest('GET', (string) $source['endpoint']) |
|
65 | 2 | ->withHeader('accept', 'application/jwt'); |
|
66 | |||
67 | 2 | $accessToken = $source['access_token'] ?? ($accessTokens[$sourceName] ?? null); |
|
68 | 2 | if ($accessToken) { |
|
69 | 2 | $request = $request->withHeader('authorization', 'Bearer ' . $accessToken); |
|
70 | } |
||
71 | |||
72 | try { |
||
73 | 2 | $responses[$sourceName] = $this->client->sendRequest($request); |
|
74 | } catch (Throwable $e) { |
||
0 ignored issues
–
show
Coding Style
Comprehensibility
introduced
by
![]() |
|||
75 | } |
||
76 | } |
||
77 | |||
78 | 2 | $claimPayloads = []; |
|
79 | 2 | foreach ($responses as $sourceName => $response) { |
|
80 | try { |
||
81 | 2 | check_server_response($response); |
|
82 | 1 | $claimPayloads[$sourceName] = $this->claimJWT($client, (string) $response->getBody()); |
|
83 | 1 | unset($claims['_claim_sources'][$sourceName]); |
|
84 | 1 | } catch (Throwable $e) { |
|
0 ignored issues
–
show
Coding Style
Comprehensibility
introduced
by
|
|||
85 | } |
||
86 | } |
||
87 | |||
88 | 2 | return $this->cleanClaims($this->assignClaims($claims, $claimNames, $claimPayloads)); |
|
89 | } |
||
90 | } |
||
91 |