Skip to content

Commit 1376ca4

Browse files
author
ogorkun
committed
MC-38539: Introduce JWT wrapper
1 parent 2aa13aa commit 1376ca4

24 files changed

+1050
-108
lines changed

app/code/Magento/JwtFrameworkAdapter/Model/Data/Header.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,10 @@
88

99
namespace Magento\JwtFrameworkAdapter\Model\Data;
1010

11+
use Magento\Framework\Jwt\Jwe\JweHeaderParameterInterface;
1112
use Magento\Framework\Jwt\Jws\JwsHeaderParameterInterface;
1213

13-
class Header implements JwsHeaderParameterInterface
14+
class Header implements JwsHeaderParameterInterface, JweHeaderParameterInterface
1415
{
1516
/**
1617
* @var string
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
7+
declare(strict_types=1);
8+
9+
namespace Magento\JwtFrameworkAdapter\Model;
10+
11+
use Jose\Component\Core\AlgorithmManager;
12+
use Jose\Easy\AlgorithmProvider;
13+
14+
class JweAlgorithmManagerFactory
15+
{
16+
private const ALGOS = [
17+
\Jose\Component\Encryption\Algorithm\KeyEncryption\RSAOAEP::class,
18+
\Jose\Component\Encryption\Algorithm\KeyEncryption\RSAOAEP256::class,
19+
\Jose\Component\Encryption\Algorithm\KeyEncryption\A128KW::class,
20+
\Jose\Component\Encryption\Algorithm\KeyEncryption\A192KW::class,
21+
\Jose\Component\Encryption\Algorithm\KeyEncryption\A256KW::class,
22+
\Jose\Component\Encryption\Algorithm\KeyEncryption\Dir::class,
23+
\Jose\Component\Encryption\Algorithm\KeyEncryption\ECDHES::class,
24+
\Jose\Component\Encryption\Algorithm\KeyEncryption\ECDHESA128KW::class,
25+
\Jose\Component\Encryption\Algorithm\KeyEncryption\ECDHESA192KW::class,
26+
\Jose\Component\Encryption\Algorithm\KeyEncryption\ECDHESA256KW::class,
27+
\Jose\Component\Encryption\Algorithm\KeyEncryption\A128GCMKW::class,
28+
\Jose\Component\Encryption\Algorithm\KeyEncryption\A192GCMKW::class,
29+
\Jose\Component\Encryption\Algorithm\KeyEncryption\A256GCMKW::class,
30+
\Jose\Component\Encryption\Algorithm\KeyEncryption\PBES2HS256A128KW::class,
31+
\Jose\Component\Encryption\Algorithm\KeyEncryption\PBES2HS384A192KW::class,
32+
\Jose\Component\Encryption\Algorithm\KeyEncryption\PBES2HS512A256KW::class
33+
];
34+
35+
public function create(): AlgorithmManager
36+
{
37+
return new AlgorithmManager((new AlgorithmProvider(self::ALGOS))->getAvailableAlgorithms());
38+
}
39+
}
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
7+
declare(strict_types=1);
8+
9+
namespace Magento\JwtFrameworkAdapter\Model;
10+
11+
use Jose\Component\Core\AlgorithmManager;
12+
use Jose\Component\Encryption\Compression\CompressionMethodManager;
13+
use Jose\Component\Encryption\JWEBuilder;
14+
use Jose\Component\Encryption\Serializer\JWESerializerManager;
15+
16+
class JweBuilderFactory
17+
{
18+
/**
19+
* @var JWESerializerManager
20+
*/
21+
private $serializers;
22+
23+
/**
24+
* @var AlgorithmManager
25+
*/
26+
private $algoManager;
27+
28+
/**
29+
* @var AlgorithmManager
30+
*/
31+
private $contentAlgoManager;
32+
33+
/**
34+
* @var CompressionMethodManager
35+
*/
36+
private $compressionManager;
37+
38+
public function __construct(
39+
JweSerializerPoolFactory $serializerPoolFactory,
40+
JweAlgorithmManagerFactory $algorithmManagerFactory,
41+
JweContentAlgorithmManagerFactory $contentAlgoManagerFactory,
42+
JweCompressionManagerFactory $compressionManagerFactory
43+
) {
44+
$this->serializers = $serializerPoolFactory->create();
45+
$this->algoManager = $algorithmManagerFactory->create();
46+
$this->contentAlgoManager = $contentAlgoManagerFactory->create();
47+
$this->compressionManager = $compressionManagerFactory->create();
48+
}
49+
50+
public function create(): JWEBuilder
51+
{
52+
return new JWEBuilder($this->algoManager, $this->contentAlgoManager, $this->compressionManager);
53+
}
54+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
7+
declare(strict_types=1);
8+
9+
namespace Magento\JwtFrameworkAdapter\Model;
10+
11+
use Jose\Component\Encryption\Compression\CompressionMethodManager;
12+
use Jose\Component\Encryption\Compression\Deflate;
13+
14+
class JweCompressionManagerFactory
15+
{
16+
public function create(): CompressionMethodManager
17+
{
18+
return new CompressionMethodManager([new Deflate()]);
19+
}
20+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
7+
declare(strict_types=1);
8+
9+
namespace Magento\JwtFrameworkAdapter\Model;
10+
11+
use Jose\Component\Core\AlgorithmManager;
12+
use Jose\Easy\AlgorithmProvider;
13+
14+
class JweContentAlgorithmManagerFactory
15+
{
16+
private const ALGOS = [
17+
\Jose\Component\Encryption\Algorithm\ContentEncryption\A128CBCHS256::class,
18+
\Jose\Component\Encryption\Algorithm\ContentEncryption\A192CBCHS384::class,
19+
\Jose\Component\Encryption\Algorithm\ContentEncryption\A256CBCHS512::class,
20+
\Jose\Component\Encryption\Algorithm\ContentEncryption\A128GCM::class,
21+
\Jose\Component\Encryption\Algorithm\ContentEncryption\A192GCM::class,
22+
\Jose\Component\Encryption\Algorithm\ContentEncryption\A256GCM::class,
23+
];
24+
25+
public function create(): AlgorithmManager
26+
{
27+
return new AlgorithmManager((new AlgorithmProvider(self::ALGOS))->getAvailableAlgorithms());
28+
}
29+
}
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
7+
declare(strict_types=1);
8+
9+
namespace Magento\JwtFrameworkAdapter\Model;
10+
11+
use Magento\Framework\Jwt\Jwe\Jwe;
12+
use Magento\Framework\Jwt\Jwe\JweHeader;
13+
use Magento\Framework\Jwt\Jwe\JweInterface;
14+
use Magento\Framework\Jwt\Jws\Jws;
15+
use Magento\Framework\Jwt\Jws\JwsHeader;
16+
use Magento\Framework\Jwt\Jws\JwsInterface;
17+
use Magento\Framework\Jwt\Payload\ArbitraryPayload;
18+
use Magento\Framework\Jwt\Payload\ClaimsPayload;
19+
use Magento\Framework\Jwt\Payload\NestedPayload;
20+
use Magento\Framework\Jwt\Payload\NestedPayloadInterface;
21+
use Magento\JwtFrameworkAdapter\Model\Data\Claim;
22+
use Magento\JwtFrameworkAdapter\Model\Data\Header;
23+
24+
/**
25+
* Create JWE data object.
26+
*/
27+
class JweFactory
28+
{
29+
public function create(
30+
array $protectedHeadersMap,
31+
string $payload,
32+
?array $unprotectedHeadersMap,
33+
?array $recipientHeadersMap
34+
): JweInterface {
35+
$protectedHeaders = [];
36+
foreach ($protectedHeadersMap as $header => $headerValue) {
37+
$protectedHeaders[] = new Header($header, $headerValue, null);
38+
}
39+
$publicHeaders = null;
40+
if ($unprotectedHeadersMap) {
41+
$publicHeaders = [];
42+
foreach ($unprotectedHeadersMap as $header => $headerValue) {
43+
$publicHeaders[] = new Header($header, $headerValue, null);
44+
}
45+
}
46+
$recipientHeader = null;
47+
if ($recipientHeadersMap) {
48+
$recipientHeader = [];
49+
foreach ($recipientHeadersMap as $header => $headerValue) {
50+
$recipientHeader[] = new Header($header, $headerValue, null);
51+
}
52+
}
53+
$headersMap = array_merge($unprotectedHeadersMap ?? [], $recipientHeader ?? [], $protectedHeadersMap);
54+
if (array_key_exists('cty', $headersMap)) {
55+
if ($headersMap['cty'] === NestedPayloadInterface::CONTENT_TYPE) {
56+
$payload = new NestedPayload($payload);
57+
} else {
58+
$payload = new ArbitraryPayload($payload);
59+
}
60+
} else {
61+
$claimData = json_decode($payload, true);
62+
$claims = [];
63+
foreach ($claimData as $name => $value) {
64+
$claims[] = new Claim($name, $value, null);
65+
}
66+
$payload = new ClaimsPayload($claims);
67+
}
68+
69+
return new Jwe(
70+
new JweHeader($protectedHeaders),
71+
$publicHeaders ? new JweHeader($publicHeaders) : null,
72+
$recipientHeader ? [new JweHeader($recipientHeader)] : null,
73+
$payload
74+
);
75+
}
76+
}
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
7+
declare(strict_types=1);
8+
9+
namespace Magento\JwtFrameworkAdapter\Model;
10+
11+
use Jose\Component\Core\AlgorithmManager;
12+
use Jose\Component\Encryption\Compression\CompressionMethodManager;
13+
use Jose\Component\Encryption\JWEDecrypter;
14+
use Jose\Component\Encryption\JWELoader;
15+
use Jose\Component\Encryption\Serializer\JWESerializerManager;
16+
17+
class JweLoaderFactory
18+
{
19+
/**
20+
* @var JWESerializerManager
21+
*/
22+
private $serializers;
23+
24+
/**
25+
* @var AlgorithmManager
26+
*/
27+
private $algoManager;
28+
29+
/**
30+
* @var AlgorithmManager
31+
*/
32+
private $contentAlgoManager;
33+
34+
/**
35+
* @var CompressionMethodManager
36+
*/
37+
private $compressionManager;
38+
39+
public function __construct(
40+
JweSerializerPoolFactory $serializerPoolFactory,
41+
JweAlgorithmManagerFactory $algorithmManagerFactory,
42+
JweContentAlgorithmManagerFactory $contentAlgoManagerFactory,
43+
JweCompressionManagerFactory $compressionManagerFactory
44+
) {
45+
$this->serializers = $serializerPoolFactory->create();
46+
$this->algoManager = $algorithmManagerFactory->create();
47+
$this->contentAlgoManager = $contentAlgoManagerFactory->create();
48+
$this->compressionManager = $compressionManagerFactory->create();
49+
}
50+
51+
public function create(): JWELoader
52+
{
53+
return new JWELoader(
54+
$this->serializers,
55+
new JWEDecrypter(
56+
$this->algoManager,
57+
$this->contentAlgoManager,
58+
$this->compressionManager
59+
),
60+
null
61+
);
62+
}
63+
}

0 commit comments

Comments
 (0)