From baed0bf609d5809eba77c781bd5347490893d065 Mon Sep 17 00:00:00 2001 From: rais0005 Date: Fri, 19 Mar 2021 01:49:08 +0100 Subject: [PATCH] =?UTF-8?q?=F0=9F=96=8B=20The=20issue=20about=20timestamp?= =?UTF-8?q?=20float=20precsion=20fixed=20using=20a=20json=5Fencode=20inste?= =?UTF-8?q?ad=20of=20(string)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Encoding/MicrosecondBasedDateConversion.php | 8 ++++---- src/Token/Parser.php | 8 +++++++- test/unit/Encoding/ChainedFormatterTest.php | 2 +- test/unit/Encoding/MicrosecondBasedDateConversionTest.php | 6 +++--- test/unit/Token/ParserTest.php | 2 +- 5 files changed, 16 insertions(+), 10 deletions(-) diff --git a/src/Encoding/MicrosecondBasedDateConversion.php b/src/Encoding/MicrosecondBasedDateConversion.php index 0f10cf0b4..2f4d621f0 100644 --- a/src/Encoding/MicrosecondBasedDateConversion.php +++ b/src/Encoding/MicrosecondBasedDateConversion.php @@ -25,16 +25,16 @@ public function formatClaims(array $claims): array return $claims; } - /** @return int|string */ + /** @return int|float */ private function convertDate(DateTimeImmutable $date) { - $seconds = $date->format('U'); + $timestamp = $date->format('U.u'); $microseconds = $date->format('u'); if ((int) $microseconds === 0) { - return (int) $seconds; + return (int) $timestamp; } - return $seconds . '.' . $microseconds; + return (float) $timestamp; } } diff --git a/src/Token/Parser.php b/src/Token/Parser.php index 2d3ac6880..530a727c4 100644 --- a/src/Token/Parser.php +++ b/src/Token/Parser.php @@ -12,8 +12,12 @@ use function count; use function explode; use function is_array; +use function is_string; +use function json_encode; use function strpos; +use const JSON_THROW_ON_ERROR; + final class Parser implements ParserInterface { private Decoder $decoder; @@ -105,7 +109,9 @@ private function parseClaims(string $data): array continue; } - $claims[$claim] = $this->convertDate((string) $claims[$claim]); + $date = $claims[$claim]; + + $claims[$claim] = $this->convertDate(is_string($date) ? $date : json_encode($date, JSON_THROW_ON_ERROR)); } return $claims; diff --git a/test/unit/Encoding/ChainedFormatterTest.php b/test/unit/Encoding/ChainedFormatterTest.php index 3d2a856f7..061999d71 100644 --- a/test/unit/Encoding/ChainedFormatterTest.php +++ b/test/unit/Encoding/ChainedFormatterTest.php @@ -34,6 +34,6 @@ public function formatClaimsShouldApplyAllConfiguredFormatters(): void $formatted = $formatter->formatClaims($claims); self::assertSame('test', $formatted[RegisteredClaims::AUDIENCE]); - self::assertSame('1487285080.123456', $formatted[RegisteredClaims::EXPIRATION_TIME]); + self::assertSame(1487285080.123456, $formatted[RegisteredClaims::EXPIRATION_TIME]); } } diff --git a/test/unit/Encoding/MicrosecondBasedDateConversionTest.php b/test/unit/Encoding/MicrosecondBasedDateConversionTest.php index 838cba0f5..4be0c6b51 100644 --- a/test/unit/Encoding/MicrosecondBasedDateConversionTest.php +++ b/test/unit/Encoding/MicrosecondBasedDateConversionTest.php @@ -36,8 +36,8 @@ public function dateClaimsHaveMicrosecondsOrSeconds(): void $formatted = $formatter->formatClaims($claims); self::assertSame(1487285080, $formatted[RegisteredClaims::ISSUED_AT]); - self::assertSame('1487285080.000123', $formatted[RegisteredClaims::NOT_BEFORE]); - self::assertSame('1487285080.123456', $formatted[RegisteredClaims::EXPIRATION_TIME]); + self::assertSame(1487285080.000123, $formatted[RegisteredClaims::NOT_BEFORE]); + self::assertSame(1487285080.123456, $formatted[RegisteredClaims::EXPIRATION_TIME]); self::assertSame('test', $formatted['testing']); // this should remain untouched } @@ -62,7 +62,7 @@ public function notAllDateClaimsNeedToBeConfigured(): void $formatted = $formatter->formatClaims($claims); self::assertSame(1487285080, $formatted[RegisteredClaims::ISSUED_AT]); - self::assertSame('1487285080.123456', $formatted[RegisteredClaims::EXPIRATION_TIME]); + self::assertSame(1487285080.123456, $formatted[RegisteredClaims::EXPIRATION_TIME]); self::assertSame('test', $formatted['testing']); // this should remain untouched } } diff --git a/test/unit/Token/ParserTest.php b/test/unit/Token/ParserTest.php index 95da07b92..5c1bf90cf 100644 --- a/test/unit/Token/ParserTest.php +++ b/test/unit/Token/ParserTest.php @@ -453,7 +453,7 @@ public function parseMustConvertDateClaimsToObjects(): void { $data = [ RegisteredClaims::ISSUED_AT => 1486930663, - RegisteredClaims::EXPIRATION_TIME => '1486930757.023055', + RegisteredClaims::EXPIRATION_TIME => 1486930757.023055, ]; $this->decoder->expects(self::exactly(2))