-
-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathNestedTokenBuilder.php
79 lines (71 loc) · 2.82 KB
/
NestedTokenBuilder.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
<?php
declare(strict_types=1);
namespace Jose\Component\NestedToken;
use function array_key_exists;
use InvalidArgumentException;
use function is_array;
use Jose\Component\Encryption\JWEBuilder;
use Jose\Component\Encryption\Serializer\JWESerializerManager;
use Jose\Component\Signature\JWSBuilder;
use Jose\Component\Signature\Serializer\JWSSerializerManager;
class NestedTokenBuilder
{
public function __construct(
private readonly JWEBuilder $jweBuilder,
private readonly JWESerializerManager $jweSerializerManager,
private readonly JWSBuilder $jwsBuilder,
private readonly JWSSerializerManager $jwsSerializerManager
) {
}
/**
* Creates a nested token.
*/
public function create(
string $payload,
array $signatures,
string $jws_serialization_mode,
array $jweSharedProtectedHeader,
array $jweSharedHeader,
array $recipients,
string $jwe_serialization_mode,
?string $aad = null
): string {
$jws = $this->jwsBuilder->create()
->withPayload($payload)
;
foreach ($signatures as $signature) {
if (! is_array($signature) || ! array_key_exists('key', $signature)) {
throw new InvalidArgumentException(
'The signatures must be an array of arrays containing a key, a protected header and a header'
);
}
$signature['protected_header'] = array_key_exists(
'protected_header',
$signature
) ? $signature['protected_header'] : [];
$signature['header'] = array_key_exists('header', $signature) ? $signature['header'] : [];
$jws = $jws->addSignature($signature['key'], $signature['protected_header'], $signature['header']);
}
$jws = $jws->build();
$token = $this->jwsSerializerManager->serialize($jws_serialization_mode, $jws);
$jweSharedProtectedHeader['cty'] = 'JWT';
$jwe = $this->jweBuilder
->create()
->withPayload($token)
->withSharedProtectedHeader($jweSharedProtectedHeader)
->withSharedHeader($jweSharedHeader)
->withAAD($aad)
;
foreach ($recipients as $recipient) {
if (! is_array($recipient) || ! array_key_exists('key', $recipient)) {
throw new InvalidArgumentException(
'The recipients must be an array of arrays containing a key and a header'
);
}
$recipient['header'] = array_key_exists('header', $recipient) ? $recipient['header'] : [];
$jwe = $jwe->addRecipient($recipient['key'], $recipient['header']);
}
$jwe = $jwe->build();
return $this->jweSerializerManager->serialize($jwe_serialization_mode, $jwe);
}
}