Bonjour,
j'essaye de realiser une notification web avec symfony et mercure afin que lorsqu'un utilisateur accede a une page (http://127.0.0.1:8000/commande/recapitulatif) une notification soit envoyer au navigateur pour le signaler.

j'ai consulter le tutoriel de grafikart dessus mais malheureusement les fonction utiliser sont deprecier et la version a subit plusieur mise a jour depuis.

j'ai donc installer mercure grâce a la commande :
[CODE]composer require mercure[/CODE]

j'ai ensuite modifier les variable environement:
.env

###> symfony/mercure-bundle ###
    # See https://symfony.com/doc/current/mercure.html#configuration
    # The URL of the Mercure hub, used by the app to publish updates (can be a local URL)
    MERCURE_URL=http://127.0.0.1:8000/.well-known/mercure
    # The public URL of the Mercure hub, used by the browser to connect
    MERCURE_PUBLIC_URL=http://127.0.0.1:8000/.well-known/mercure
    # The secret used to sign the JWTs
    MERCURE_JWT_SECRET="secret"
###< symfony/mercure-bundle ###

j'ai modifier les URL par http au lieu de https car j avais une erreur SSL connect error for “[url]https://127.0.0.1:8000/.well-known/mercure”[/url] car je pense que mon application est en http pour le moment et ne genere pas de certificat ssl pour communiquer avec le hub.

j ai modifié mon MERCURE_JWT_SECRET en utilisant [URL="https://jwt.io/"]https://jwt.io/[/URL] en ajoutant au payload :

{
  "mercure": {
    "publish": ["*"]
  }
}

et ma clé secrète dans la zone de saisie (VERIFY SIGNATURE) your-256-bit-secret, que j'ai ensuite ajouter à MERCURE_JWT_SECRET.

j'ai ensuite crée un fichier js sur la page ou je souhaite recevoir les notifications.

const eventSource = new EventSource('http://127.0.0.1:8000/.well-known/mercure?topic=' + encodeURIComponent('http://127.0.0.1:8000/commande/recapitulatif'),
    );
eventSource.onmessage = event => {
    // Will be called every time an update is published by the server
    alert("Commande");
    console.log(JSON.parse(event.data));
}

je souhaite envoyer une notification lorsqu'un utilisateur accède a la page [url]http://127.0.0.1:8000/commande/recapitulatif[/url].

j'ai donc ajouter ce code dans le contrôleur de la page en question.

$update = new Update(
            'http://127.0.0.1:8000/commande/recapitulatif',
            json_encode(['status' => 'Commande'])
        );

        $hub->publish($update);

ma page qui écoute les notification apparemment me crée bien une connexion avec le hub et renvoie une réponse 200.

Request URL: http://127.0.0.1:8000/.well-known/mercure?topic=http%3A%2F%2F127.0.0.1%3A8000%2Fcommande%2Frecapitulatif
Request Method: GET
Status Code: 200 OK
Remote Address: 127.0.0.1:8000
Referrer Policy: strict-origin-when-cross-origin

le log de ma page qui recois les notification me donne:

[Application] Jun 26 17:33:45 |DEBUG  | SECURI Stored the security token in the session. key="_security_main"
[Web Server ] Jun 26 19:33:45 |INFO   | SERVER GET  (200) /favicon.ico ip="127.0.0.1"
[Application] Jun 26 17:33:46 |INFO   | REQUES Matched route "_wdt". method="GET" request_uri="http://127.0.0.1:8000/_wdt/8f2711" route="_wdt" route_parameters={"_controller":"web_profiler.controller.profiler::toolbarAction","_route
":"_wdt","token":"8f2711"}
[Web Server ] Jun 26 19:33:47 |INFO   | SERVER GET  (200) /_wdt/8f2711 ip="127.0.0.1"

par contre lorsque j'essaye de me connecter a la page qui dois crée la notification [url]http://127.0.0.1:8000/commande/recapitulatif[/url] j'obtiens une erreur <<failed to send an update>> et un autre message <<HTTP/1.1 401 Unauthorized returned for "http://127.0.0.1:8000/.well-known/mercure".>>

[Application] Jun 26 20:11:41 |INFO   | HTTP_C Request: "POST http://127.0.0.1:8000/.well-known/mercure"
[Application] Jun 26 20:11:41 |INFO   | HTTP_C Response: "401 http://127.0.0.1:8000/.well-known/mercure"
[Application] Jun 26 20:11:41 |CRITICA| REQUES Uncaught PHP Exception Symfony\Component\Mercure\Exception\RuntimeException: "Failed to send an update." at C:\laragon\www\Projet\Restaurant\RelaisDesVoutes\vendor\symfony\mercure\src\H
ub.php line 104
[Application] Jun 26 20:11:41 |DEBUG  | SECURI Stored the security token in the session. key="_security_main"
[Web Server ] Jun 26 22:11:41 |ERROR  | SERVER POST (500) /commande/recapitulatif host="127.0.0.1:8004" ip="127.0.0.1" scheme="https"
[Application] Jun 26 20:13:07 |INFO   | REQUES Matched route "order_recap". method="POST" request_uri="http://127.0.0.1:8000/commande/recapitulatif" route="order_recap" route_parameters={"_controller":"App\\Controller\\OrderControll
er::add","_route":"order_recap"}

j'ai essayer d'ajouter dicovery comme la doc parle afin d'ajouter des autorisations mon envoie enfin je pense.

$discovery->addLink($request);

            $response = new JsonResponse([
                '@id' => 'http://127.0.0.1:8000/commande/recapitulatif',
                'status' => 'Order',
            ]);

            $response->headers->setCookie(
                $authorization->createCookie($request, ['http://127.0.0.1:8000/commande/recapitulatif'])
            );

et modifier :

$update = new Update(
                'http://127.0.0.1:8000/commande/recapitulatif',
                json_encode(['status' => 'Commande']), true
            );

            $hub->publish($update);

avec true pour ajouter l'authorisation, ainsi que :

const eventSource = new EventSource('http://127.0.0.1:8000/.well-known/mercure?topic=' + encodeURIComponent('http://127.0.0.1:8000/commande/recapitulatif'), {
        withCredentials: true
    }
    );
eventSource.onmessage = event => {
    // Will be called every time an update is published by the server
    alert("Commande");
    console.log(JSON.parse(event.data));

l'option withCredientials.

maintenant j'obtiens ce log:

[Application] Jun 26 20:18:13 |INFO   | HTTP_C Request: "POST http://127.0.0.1:8000/.well-known/mercure"
[Application] Jun 26 20:18:13 |INFO   | HTTP_C Response: "401 http://127.0.0.1:8000/.well-known/mercure"
[Application] Jun 26 20:18:13 |CRITICA| REQUES Uncaught PHP Exception Symfony\Component\Mercure\Exception\RuntimeException: "Failed to send an update." at C:\laragon\www\Projet\Restaurant\RelaisDesVoutes\vendor\symfony\mercure\src\H
ub.php line 104
[Application] Jun 26 20:18:13 |DEBUG  | SECURI Stored the security token in the session. key="_security_main"
[Web Server ] Jun 26 22:18:14 |ERROR  | SERVER POST (500) /commande/recapitulatif host="127.0.0.1:8004" ip="127.0.0.1" scheme="https"

Je ne suis absolument pas sur de tous ce que je viens de détailler et j'espère que je ne suis pas trop loin du compte.
Si vous avez besoin de plus d'information n'hésiter pas a demander.

Si quelqu'un peux m'aider en m'expliquant mon erreur je vous en remercie d'avance.

Ce que je veux

reussir a envoyer une notification lorsqu'un utilisateur accede a la page http://127.0.0.1:8000/commande/recapitulatif.

Ce que j'obtiens

<<failed to send an update>> et un autre message <<HTTP/1.1 401 Unauthorized returned for "http://127.0.0.1:8000/.well-known/mercure".>>

1 réponse


Bonjours,
apres plusieur essaye je me demande si mon probleme ne viens pas du fait que mon application soit en http et non pas en https meme si j'ai modifié les variables d'environements pour qu'elle soit en https le probleme ne ce resolve pas.
Si quelqu'un peux m'aiguiller avec ce probleme merci d'avance.
mon dernier log:

IN product p1_ ON p1_.id = m3_.product_id LEFT JOIN category c2_ ON p1_.category_id = c2_.id WHERE m0_.display_day = ? 0="2021-06-27"
[Application] Jun 27 14:37:36 |INFO   | HTTP_C Request: "POST http://127.0.0.1:8000/.well-known/mercure"
[Application] Jun 27 14:37:36 |INFO   | HTTP_C Response: "401 http://127.0.0.1:8000/.well-known/mercure"
[Application] Jun 27 14:37:36 |CRITICA| REQUES Uncaught PHP Exception Symfony\Component\Mercure\Exception\RuntimeException: "Failed to send an update." at C:\laragon\www\Projet\Restaurant\RelaisDesVoutes\vendor\symfony\mercure\src\H
ub.php line 104
[Application] Jun 27 14:37:36 |DEBUG  | SECURI Stored the security token in the session. key="_security_main"
[Web Server ] Jun 27 16:37:36 |INFO   | MERCUR Topic selectors not matched, not provided or authorization error
[Web Server ] Jun 27 16:37:36 |WARN   | SERVER POST (401) /.well-known/mercure host="127.0.0.1:8004" ip="127.0.0.1" scheme="https"
[Web Server ] Jun 27 16:37:37 |ERROR  | SERVER POST (500) /commande/recapitulatif
[Web Server ] Jun 27 16:46:53 |DEBUG  | MERCUR write timeout: close the connection
[Web Server ] Jun 27 16:46:53 |INFO   | MERCUR Subscriber disconnected
[Web Server ] Jun 27 16:46:53 |INFO   | SERVER GET  (200) /.well-known/mercure?topic=http%3A%2F%2F127.0.0.1%3A8000%2Fcommande%2Frecapitulatif ip="127.0.0.1"
[Web Server ] Jun 27 16:46:56 |INFO   | MERCUR New subscriber