From 00136e3eedd73f2919d0479908961a7f24da84f6 Mon Sep 17 00:00:00 2001 From: Stephen Beirlaen <11806615+StephenBeirlaen@users.noreply.github.com> Date: Wed, 23 Dec 2020 17:45:10 +0100 Subject: [PATCH] Encode timestamps as float instead of string values Some JWT parsers like auth0/node-jsonwebtoken and jwt.io complain about timestamps formatted as a string. --- src/Encoding/MicrosecondBasedDateConversion.php | 5 +++-- test/unit/Encoding/ChainedFormatterTest.php | 2 +- test/unit/Encoding/MicrosecondBasedDateConversionTest.php | 6 +++--- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/Encoding/MicrosecondBasedDateConversion.php b/src/Encoding/MicrosecondBasedDateConversion.php index 0f10cf0b..bcee6760 100644 --- a/src/Encoding/MicrosecondBasedDateConversion.php +++ b/src/Encoding/MicrosecondBasedDateConversion.php @@ -8,6 +8,7 @@ use Lcobucci\JWT\Token\RegisteredClaims; use function array_key_exists; +use function floatval; final class MicrosecondBasedDateConversion implements ClaimsFormatter { @@ -25,7 +26,7 @@ public function formatClaims(array $claims): array return $claims; } - /** @return int|string */ + /** @return int|float */ private function convertDate(DateTimeImmutable $date) { $seconds = $date->format('U'); @@ -35,6 +36,6 @@ private function convertDate(DateTimeImmutable $date) return (int) $seconds; } - return $seconds . '.' . $microseconds; + return floatval($seconds . '.' . $microseconds); } } diff --git a/test/unit/Encoding/ChainedFormatterTest.php b/test/unit/Encoding/ChainedFormatterTest.php index 3d2a856f..061999d7 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 838cba0f..4be0c6b5 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 } }