42, 'typ'=>'teacher', 'sid'=>'', 'roles'=>[]] */ public static function issue(array $claims, ?int $ttl = null): string { $now = time(); $payload = array_merge([ 'iss' => defined('BASE_URL') ? BASE_URL : 'geograsim', 'iat' => $now, 'nbf' => $now, 'exp' => $now + ($ttl ?? (defined('JWT_TTL') ? JWT_TTL : 900)), ], $claims); return FirebaseJWT::encode($payload, self::secret(), self::ALG); } /** * Access-Token prüfen. Gibt die Claims als Array zurück oder null * (bei ungültiger Signatur, abgelaufen, noch nicht gültig, kaputt). */ public static function verify(string $token): ?array { try { $decoded = FirebaseJWT::decode($token, new Key(self::secret(), self::ALG)); return (array) $decoded; } catch (\Throwable $e) { return null; // ExpiredException, SignatureInvalidException, … } } }