From 916864e7dffbb3d53d053c8da57fd5a629c84f1b Mon Sep 17 00:00:00 2001 From: Luke Kuzmish <42181698+cosmastech@users.noreply.github.com> Date: Sat, 19 Jul 2025 07:23:45 -0400 Subject: [PATCH 1/4] Update ExpiredException.php --- src/ExpiredException.php | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/ExpiredException.php b/src/ExpiredException.php index 12fef094..25f44513 100644 --- a/src/ExpiredException.php +++ b/src/ExpiredException.php @@ -6,6 +6,8 @@ class ExpiredException extends \UnexpectedValueException implements JWTException { private object $payload; + private ?int $timestamp = null; + public function setPayload(object $payload): void { $this->payload = $payload; @@ -15,4 +17,14 @@ public function getPayload(): object { return $this->payload; } + + public function setTimestamp(int $timestamp): void + { + $this->timestamp = $timestamp; + } + + public function getTimestamp(): ?int + { + return $this->timestamp; + } } From aa60b99ec35386b2a48627910c6803147e35aabf Mon Sep 17 00:00:00 2001 From: Luke Kuzmish <42181698+cosmastech@users.noreply.github.com> Date: Sat, 19 Jul 2025 07:27:48 -0400 Subject: [PATCH 2/4] Update JWT.php --- src/JWT.php | 1 + 1 file changed, 1 insertion(+) diff --git a/src/JWT.php b/src/JWT.php index 5386b601..5404104a 100644 --- a/src/JWT.php +++ b/src/JWT.php @@ -185,6 +185,7 @@ public static function decode( if (isset($payload->exp) && ($timestamp - static::$leeway) >= $payload->exp) { $ex = new ExpiredException('Expired token'); $ex->setPayload($payload); + $ex->setTimestamp($timestamp); throw $ex; } From a2f8dfba2784e36df9c97e0e74ac84b63ce79b66 Mon Sep 17 00:00:00 2001 From: Luke Kuzmish <42181698+cosmastech@users.noreply.github.com> Date: Sat, 19 Jul 2025 07:32:16 -0400 Subject: [PATCH 3/4] Update JWTTest.php --- tests/JWTTest.php | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/tests/JWTTest.php b/tests/JWTTest.php index 805b867a..1da5b56e 100644 --- a/tests/JWTTest.php +++ b/tests/JWTTest.php @@ -130,6 +130,26 @@ public function testExpiredExceptionPayload() } } + public function testExpiredExceptionTimestamp() + { + $this->expectException(ExpiredException::class); + + JWT::$timestamp = 98765; + $payload = [ + 'message' => 'abc', + 'exp' => 1234, + ]; + $encoded = JWT::encode($payload, 'my_key', 'HS256'); + + try { + JWT::decode($encoded, new Key('my_key', 'HS256')); + } catch (ExpiredException $e) { + $exTimestamp = $e->getTimestamp(); + $this->assertSame(98765, $exTimestamp); + throw $e; + } + } + public function testBeforeValidExceptionPayload() { $this->expectException(BeforeValidException::class); From 2ba4d2dc4d1597a92c5ab5e94b14ae5417429da1 Mon Sep 17 00:00:00 2001 From: Luke Kuzmish Date: Sat, 19 Jul 2025 07:36:33 -0400 Subject: [PATCH 4/4] run in separate process --- tests/JWTTest.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tests/JWTTest.php b/tests/JWTTest.php index 1da5b56e..de744311 100644 --- a/tests/JWTTest.php +++ b/tests/JWTTest.php @@ -130,6 +130,9 @@ public function testExpiredExceptionPayload() } } + /** + * @runInSeparateProcess + */ public function testExpiredExceptionTimestamp() { $this->expectException(ExpiredException::class);