Skip to content

Commit ff44a42

Browse files
committed
attempt to implement support for cached keyset
1 parent 4cd6248 commit ff44a42

File tree

2 files changed

+20
-2
lines changed

2 files changed

+20
-2
lines changed

composer.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,8 @@
2121
"cakephp/cakephp": "^4.0",
2222
"cakephp/cakephp-codesniffer": "^4.0",
2323
"firebase/php-jwt": "^6.2",
24-
"phpunit/phpunit": "^8.5 || ^9.3"
24+
"phpunit/phpunit": "^8.5 || ^9.3",
25+
"symfony/cache": "^6.0"
2526
},
2627
"suggest": {
2728
"cakephp/orm": "To use \"OrmResolver\" (Not needed separately if using full CakePHP framework).",

src/Authenticator/JwtAuthenticator.php

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,14 +18,19 @@
1818

1919
use ArrayObject;
2020
use Authentication\Identifier\IdentifierInterface;
21+
use Cake\Cache\Cache;
22+
use Cake\Http\Client;
2123
use Cake\Utility\Security;
2224
use Exception;
25+
use Firebase\JWT\CachedKeySet;
2326
use Firebase\JWT\JWK;
2427
use Firebase\JWT\JWT;
2528
use Firebase\JWT\Key;
29+
use Laminas\Diactoros\RequestFactory;
2630
use Psr\Http\Message\ServerRequestInterface;
2731
use RuntimeException;
2832
use stdClass;
33+
use Symfony\Component\Cache\Adapter\Psr16Adapter;
2934

3035
class JwtAuthenticator extends TokenAuthenticator
3136
{
@@ -41,6 +46,7 @@ class JwtAuthenticator extends TokenAuthenticator
4146
'secretKey' => null,
4247
'subjectKey' => IdentifierInterface::CREDENTIAL_JWT_SUBJECT,
4348
'jwks' => null,
49+
'jwksCache' => null,
4450
];
4551

4652
/**
@@ -149,7 +155,18 @@ protected function decodeToken(string $token): ?object
149155
{
150156
$jsonWebKeySet = $this->getConfig('jwks');
151157
if ($jsonWebKeySet) {
152-
$keySet = JWK::parseKeySet($jsonWebKeySet);
158+
$jsonWebKeySetCache = $this->getConfig('jwksCache');
159+
if ($jsonWebKeySetCache) {
160+
$keySet = new CachedKeySet(
161+
$jsonWebKeySet,
162+
new Client(),
163+
new RequestFactory(),
164+
new Psr16Adapter(Cache::pool($jsonWebKeySetCache)),
165+
3000
166+
);
167+
} else {
168+
$keySet = JWK::parseKeySet($jsonWebKeySet);
169+
}
153170

154171
return JWT::decode(
155172
$token,

0 commit comments

Comments
 (0)