From ba4aa2db81829f8abbed12331ab8dd1906e432b5 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 | 16 +--------------- src/Token/Parser.php | 8 +++++++- test/unit/Encoding/ChainedFormatterTest.php | 2 +- .../MicrosecondBasedDateConversionTest.php | 12 +++++------- test/unit/Token/ParserTest.php | 2 +- 5 files changed, 15 insertions(+), 25 deletions(-) diff --git a/src/Encoding/MicrosecondBasedDateConversion.php b/src/Encoding/MicrosecondBasedDateConversion.php index 0f10cf0b4..988757542 100644 --- a/src/Encoding/MicrosecondBasedDateConversion.php +++ b/src/Encoding/MicrosecondBasedDateConversion.php @@ -3,7 +3,6 @@ namespace Lcobucci\JWT\Encoding; -use DateTimeImmutable; use Lcobucci\JWT\ClaimsFormatter; use Lcobucci\JWT\Token\RegisteredClaims; @@ -19,22 +18,9 @@ public function formatClaims(array $claims): array continue; } - $claims[$claim] = $this->convertDate($claims[$claim]); + $claims[$claim] = (float) $claims[$claim]->format('U.u'); } return $claims; } - - /** @return int|string */ - private function convertDate(DateTimeImmutable $date) - { - $seconds = $date->format('U'); - $microseconds = $date->format('u'); - - if ((int) $microseconds === 0) { - return (int) $seconds; - } - - return $seconds . '.' . $microseconds; - } } 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..d0f4c0e70 100644 --- a/test/unit/Encoding/MicrosecondBasedDateConversionTest.php +++ b/test/unit/Encoding/MicrosecondBasedDateConversionTest.php @@ -14,7 +14,6 @@ final class MicrosecondBasedDateConversionTest extends TestCase * @test * * @covers ::formatClaims - * @covers ::convertDate */ public function dateClaimsHaveMicrosecondsOrSeconds(): void { @@ -35,9 +34,9 @@ public function dateClaimsHaveMicrosecondsOrSeconds(): void $formatter = new MicrosecondBasedDateConversion(); $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.0, $formatted[RegisteredClaims::ISSUED_AT]); + 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 } @@ -45,7 +44,6 @@ public function dateClaimsHaveMicrosecondsOrSeconds(): void * @test * * @covers ::formatClaims - * @covers ::convertDate */ public function notAllDateClaimsNeedToBeConfigured(): void { @@ -61,8 +59,8 @@ public function notAllDateClaimsNeedToBeConfigured(): void $formatter = new MicrosecondBasedDateConversion(); $formatted = $formatter->formatClaims($claims); - self::assertSame(1487285080, $formatted[RegisteredClaims::ISSUED_AT]); - self::assertSame('1487285080.123456', $formatted[RegisteredClaims::EXPIRATION_TIME]); + self::assertSame(1487285080.0, $formatted[RegisteredClaims::ISSUED_AT]); + 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))