Correct mercure token route

This commit is contained in:
Charles 2025-11-24 08:53:48 +01:00
parent d884ff4155
commit 9d37a7c549
3 changed files with 43 additions and 37 deletions

View File

@ -34,10 +34,9 @@ export default class extends Controller {
async connectToMercure() {
try {
// Fetch the JWT token and topic from the server
const response = await fetch('/notifications/mercure-token');
const response = await fetch('/mercure-token');
const data = await response.json();
console.log('Mercure token data:', data);
// Use server-provided topic if available, otherwise fallback to default per-user topic
const topic = data.topic || `http://portail.solutions-easy.moi/notifications/user/${this.userIdValue}`;
@ -49,11 +48,6 @@ export default class extends Controller {
url.searchParams.append('authorization', data.token);
}
console.log('Connecting to Mercure...');
console.log('Mercure URL:', this.mercureUrlValue);
console.log('Topic:', topic);
console.log('Full URL:', url.toString());
try {
this.eventSource = new EventSource(url.toString());
} catch (e) {
@ -62,11 +56,9 @@ export default class extends Controller {
}
this.eventSource.onopen = () => {
console.log('✅ Mercure connection established successfully!');
};
this.eventSource.onmessage = (event) => {
console.log('📨 New notification received:', event.data);
try {
const notification = JSON.parse(event.data);
this.handleNewNotification(notification);
@ -76,7 +68,6 @@ export default class extends Controller {
};
this.eventSource.onerror = (error) => {
console.error('❌ Mercure connection error:', error);
try {
console.error('EventSource readyState:', this.eventSource.readyState);
} catch (e) {

View File

@ -0,0 +1,42 @@
<?php
namespace App\Controller;
use Lcobucci\JWT\Configuration;
use Lcobucci\JWT\Signer\Hmac\Sha256;
use Lcobucci\JWT\Signer\Key\InMemory;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\Routing\Attribute\Route;
class MercureController extends AbstractController
{
#[Route(path: '/mercure-token', name: 'mercure_token', methods: ['GET'])]
public function getMercureToken(): JsonResponse
{
$this->denyAccessUnlessGranted('IS_AUTHENTICATED_FULLY');
$user = $this->userService->getUserByIdentifier($this->getUser()->getUserIdentifier());
$topic = sprintf('http://portail.solutions-easy.moi/notifications/user/%d', $user->getId());
// Generate JWT token for Mercure subscription
$secret = $_ENV['MERCURE_JWT_SECRET'];
$config = Configuration::forSymmetricSigner(
new Sha256(),
InMemory::plainText($secret)
);
$token = $config->builder()
->withClaim('mercure', [
'subscribe' => [$topic]
])
->getToken($config->signer(), $config->signingKey());
return new JsonResponse([
'token' => $token->toString(),
'topic' => $topic,
'userId' => $user->getId(),
]);
}
}

View File

@ -113,32 +113,5 @@ class NotificationController extends AbstractController
return new JsonResponse(['success' => true]);
}
#[Route(path: '/mercure-token', name: 'mercure_token', methods: ['GET'])]
public function getMercureToken(): JsonResponse
{
$this->denyAccessUnlessGranted('IS_AUTHENTICATED_FULLY');
$user = $this->userService->getUserByIdentifier($this->getUser()->getUserIdentifier());
$topic = sprintf('http://portail.solutions-easy.moi/notifications/user/%d', $user->getId());
// Generate JWT token for Mercure subscription
$secret = $_ENV['MERCURE_JWT_SECRET'];
$config = Configuration::forSymmetricSigner(
new Sha256(),
InMemory::plainText($secret)
);
$token = $config->builder()
->withClaim('mercure', [
'subscribe' => [$topic]
])
->getToken($config->signer(), $config->signingKey());
return new JsonResponse([
'token' => $token->toString(),
'topic' => $topic,
'userId' => $user->getId(),
]);
}
}