Skip to content

Commit dc48d5c

Browse files
authored
ENGCOM-8999: magento2#32636: Improved JWK check in the JwsManager class to account… #32637
2 parents 54f890a + 7b13fb9 commit dc48d5c

File tree

2 files changed

+63
-5
lines changed

2 files changed

+63
-5
lines changed

app/code/Magento/JwtFrameworkAdapter/Model/JwsManager.php

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -93,10 +93,6 @@ public function build(JwsInterface $jws, EncryptionSettingsInterface $encryption
9393
$builder = $builder->withPayload($jws->getPayload()->getContent());
9494
for ($i = 0; $i < $signaturesCount; $i++) {
9595
$jwk = $encryptionSettings->getJwkSet()->getKeys()[$i];
96-
$alg = $jwk->getAlgorithm();
97-
if (!$alg) {
98-
throw new EncryptionException('Algorithm is required for JWKs');
99-
}
10096
$protected = [];
10197
if ($jws->getPayload()->getContentType()) {
10298
$protected['cty'] = $jws->getPayload()->getContentType();
@@ -107,7 +103,10 @@ public function build(JwsInterface $jws, EncryptionSettingsInterface $encryption
107103
if ($jws->getProtectedHeaders()) {
108104
$protected = array_merge($protected, $this->extractHeaderData($jws->getProtectedHeaders()[$i]));
109105
}
110-
$protected['alg'] = $alg;
106+
$protected['alg'] = $protected['alg'] ?? $jwk->getAlgorithm();
107+
if (!$protected['alg']) {
108+
throw new EncryptionException('Algorithm is required for JWKs');
109+
}
111110
$unprotected = [];
112111
if ($jws->getUnprotectedHeaders()) {
113112
$unprotected = $this->extractHeaderData($jws->getUnprotectedHeaders()[$i]);
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
namespace Magento\JwtFrameworkAdapter\Model;
7+
8+
class JwsManagerTest extends \PHPUnit\Framework\TestCase
9+
{
10+
/**
11+
* @var \Magento\Framework\ObjectManagerInterface
12+
*/
13+
private $objectManager;
14+
15+
protected function setUp(): void
16+
{
17+
$this->objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
18+
19+
parent::setUp();
20+
}
21+
22+
public function testCreatingJwsWithAlgorithmSetInHeadersDirectly(): void
23+
{
24+
$secret = "ZXF1YXRpb24tS2VudHVja3ktY29udGludWVkLWRpZmZlcmVuY2U=";
25+
$payload = json_encode([
26+
'MyCustomClaim' => 'some value', // not important at all
27+
'nbf' => time(),
28+
'exp' => time() + 600,
29+
'iat' => time()
30+
]);
31+
$header = [
32+
'alg' => 'HS256',
33+
'typ' => 'JWT'
34+
];
35+
36+
/** @var \Magento\Framework\Jwt\JwkFactory $jwkFactory */
37+
$jwkFactory = $this->objectManager->create(\Magento\Framework\Jwt\JwkFactory::class);
38+
$jwk = $jwkFactory->createFromData(['kty' => 'oct', 'k' => $secret]);
39+
40+
/** @var \Magento\JwtFrameworkAdapter\Model\JwsFactory $jwsFactory */
41+
$jwsFactory = $this->objectManager->create(\Magento\JwtFrameworkAdapter\Model\JwsFactory::class);
42+
$jws = $jwsFactory->create($header, $payload, null);
43+
44+
/** @var \Magento\Framework\Jwt\Jws\JwsSignatureSettingsInterface $encryptionSettings */
45+
$encryptionSettings = $this->objectManager->create(
46+
\Magento\Framework\Jwt\Jws\JwsSignatureJwks::class,
47+
[
48+
'jwk' => $jwk
49+
]
50+
);
51+
52+
/** @var \Magento\JwtFrameworkAdapter\Model\JwsManager $jwsManager */
53+
$jwsManager = $this->objectManager->create(\Magento\JwtFrameworkAdapter\Model\JwsManager::class);
54+
55+
$token = $jwsManager->build($jws, $encryptionSettings);
56+
57+
$this->assertIsString($token);
58+
}
59+
}

0 commit comments

Comments
 (0)