Magento 2 Experten — Hyvä Theme, Tailwind CSS & SEO aus einer Hand ›

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

api/src/State/Provider/MercureAuthorizationTrait.php
<?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.

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.