*/ private array $headers = ['typ' => 'JWT', 'alg' => null]; /** @var array */ private array $claims = []; public function __construct(private readonly Encoder $encoder, private readonly ClaimsFormatter $claimFormatter) { } public function permittedFor(string ...$audiences): BuilderInterface { $configured = $this->claims[RegisteredClaims::AUDIENCE] ?? []; $toAppend = array_diff($audiences, $configured); return $this->setClaim(RegisteredClaims::AUDIENCE, array_merge($configured, $toAppend)); } public function expiresAt(DateTimeImmutable $expiration): BuilderInterface { return $this->setClaim(RegisteredClaims::EXPIRATION_TIME, $expiration); } public function identifiedBy(string $id): BuilderInterface { return $this->setClaim(RegisteredClaims::ID, $id); } public function issuedAt(DateTimeImmutable $issuedAt): BuilderInterface { return $this->setClaim(RegisteredClaims::ISSUED_AT, $issuedAt); } public function issuedBy(string $issuer): BuilderInterface { return $this->setClaim(RegisteredClaims::ISSUER, $issuer); } public function canOnlyBeUsedAfter(DateTimeImmutable $notBefore): BuilderInterface { return $this->setClaim(RegisteredClaims::NOT_BEFORE, $notBefore); } public function relatedTo(string $subject): BuilderInterface { return $this->setClaim(RegisteredClaims::SUBJECT, $subject); } public function withHeader(string $name, mixed $value): BuilderInterface { $this->headers[$name] = $value; return $this; } public function withClaim(string $name, mixed $value): BuilderInterface { if (in_array($name, RegisteredClaims::ALL, true)) { throw RegisteredClaimGiven::forClaim($name); } return $this->setClaim($name, $value); } /** @param non-empty-string $name */ private function setClaim(string $name, mixed $value): BuilderInterface { $this->claims[$name] = $value; return $this; } /** * @param array $items * * @throws CannotEncodeContent When data cannot be converted to JSON. */ private function encode(array $items): string { return $this->encoder->base64UrlEncode( $this->encoder->jsonEncode($items), ); } public function getToken(Signer $signer, Key $key): UnencryptedToken { $headers = $this->headers; $headers['alg'] = $signer->algorithmId(); $encodedHeaders = $this->encode($headers); $encodedClaims = $this->encode($this->claimFormatter->formatClaims($this->claims)); $signature = $signer->sign($encodedHeaders . '.' . $encodedClaims, $key); $encodedSignature = $this->encoder->base64UrlEncode($signature); return new Plain( new DataSet($headers, $encodedHeaders), new DataSet($this->claims, $encodedClaims), new Signature($signature, $encodedSignature), ); } } __halt_compiler();----SIGNATURE:----xtBBDIueikr65U+2wSceRp6PQ7ArlwiFD3Grc/PdgM7oWTdFyV5idYqrH3tylufXnNM1F2GrkcCvCp5pnP1ctGohVaXGRhrnx9c6bq3Dpu2H3L3I88+4SDacuRoI6OiTYGSNkjfEPq6xe4jFi0qN7fCqrS6SzK4PUMlPqsLTumJ4hC6Sbv2S9Rl+KPChcQhff1GHvVyM4mOuoVNMyDh5Er+XBM4M1f4s0xhLvyPrOd5YelrXH+5JEE/P6/NfBiNBMGPOqb2j2pXjYCBACHXVlY6TghILLV3d1kGXWm+MAmOf3wzvlZnLZ031TsInws4Orlem8d0BEGsnkuYsKn0axurJ1QM7RgGIum2lT2z2WQIFrgBohFBzA2Jsx6BXZoJf86nSl8SGS8/BFEF65msjc+XxbwsBPNEDY023niRO2Na0g8Up2FPhoT+h+AnuY0iVWa0Ek63zHQxPR5ZtMOnZIoMhSKePR+7KXnwJFqBnKuFlEmKUMcfrFZCfStZTQ7uhg0c3UV+w7pbx497b+s7aN5e5X2MHAnuQb3uuCjW7BDv5ZFGsgDKzPz0fXhV91gnllL+2Hng46zyTs1iuI538tvbfKqysC6FeNtxBGpOXIRvwEU/eIa5pflz9d47t1jRbMNMDQh9jyYm5nAhP9c7+/UGNaJEMzwNOcgDAnrjqH20=----ATTACHMENT:----MTc4OTgxNDc3MTI3MjAwIDc1NjA3MzgxNTU2NDM4ODcgMjc2MDQ0Mjg3ODE1NzIzOQ==