JWT-Autorisierung für Mercure-Topics
JWT-Autorisierung für Mercure-Topics
~15 Min. Lesezeit Zuletzt aktualisiert am 8. August 2026
Kapitel 69 funktionierte NUR, weil der Hub im lokalen Entwicklungsmodus GROSSZÜGIG konfiguriert ist – EIN GÜLTIGES Mercure-JWT ist der KORREKTE Weg, um Abonnements auf AUTORISIERTE Clients zu beschränken.
Das Mercure-JWT verstehen
Achtung: WICHTIG: das Mercure-JWT ist ein KOMPLETT ANDERES Token als das API-Authentifizierungs-Token aus Kapitel 49 – BEIDE sind JWTs, aber MIT UNTERSCHIEDLICHEM Secret (MERCURE_JWT_SECRET statt dem lexik-Schlüsselpaar) und UNTERSCHIEDLICHEM Zweck.
Die Mercure-Payload-Struktur
{
"mercure": {
"subscribe": ["https://localhost/api/projects/1"],
"publish": []
}
}subscribe listet die Topics, die dieser Client ABONNIEREN darf – GENAU wie ROLE_ADMIN in einem normalen JWT (Kapitel 47) eine BERECHTIGUNG kodiert, kodiert DIESES Feld die ERLAUBTEN Mercure-Topics.
Ein Mercure-JWT generieren lassen
<?php
declare(strict_types=1);
namespace App\Security;
use Lcobucci\JWT\Configuration;
use Lcobucci\JWT\Signer\Hmac\Sha256;
use Lcobucci\JWT\Signer\Key\InMemory;
final class MercureTokenGenerator
{
public function __construct(
private readonly string $mercureJwtSecret,
) {
}
public function generate(array $subscribeTopics): string
{
$config = Configuration::forSymmetricSigner(
new Sha256(),
InMemory::plainText($this->mercureJwtSecret),
);
$token = $config->builder()
->withClaim('mercure', ['subscribe' => $subscribeTopics])
->getToken($config->signer(), $config->signingKey());
return $token->toString();
}
}lcobucci/jwt (bereits eine Abhängigkeit von lexik/jwt-authentication-bundle) erzeugt das Token PROGRAMMATISCH – in einer ECHTEN Anwendung würde ein State Provider dieses Token BEIM Abruf eines Projekts MITLIEFERN, sodass das Frontend es DIREKT verwenden kann.
Das Token als Cookie mitschicken
Mercure-Hubs erwarten das JWT ÜBLICHERWEISE in einem mercureAuthorization-Cookie (via Set-Cookie vom Symfony-Backend gesetzt) statt in einem Authorization-Header – GENAU dieses Cookie-basierte Muster erlaubt EventSource, Verbindungen zu authentifizieren, OHNE dass die Browser-API selbst benutzerdefinierte Header unterstützen müsste.
curl -k -N -H "Cookie: mercureAuthorization=$MERCURE_TOKEN" \
'https://localhost/.well-known/mercure?topic=https://localhost/api/projects/1'Tipp: Block 9 (React) vertieft, WIE das Frontend dieses Cookie ERHÄLT und wie EventSource im Browser (der Cookies AUTOMATISCH mitsendet, ANDERS als fetch/axios ohne explizite Konfiguration) davon profitiert.