thomasvargiu /
php-openid-client
| 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
Loading history...
|
|||
| 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 |