Symfony 5 Не удалось отправить сообщение об ошибке SSL — подключения обновления для «https://127.0.0.1:8000/.well-known/mercure»

#symfony5 #mercure

Вопрос:

я студент и новичок, заранее извиняюсь, если не понимаю. Я пытаюсь использовать Symfony 5 с mercure, но у меня возникли некоторые трудности с отправкой обновления в концентратор. я проверяю документ в Symfony Mercure doc и думаю сделать хорошую часть об этом, но не все.

я установил docker в Windows 10 и устанавливаю его непосредственно с помощью интерфейса командной строки Symfony, как написано в документе. мой параметр по умолчанию является параметром, который устанавливает интерфейс командной строки. .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=https://127.0.0.1:8000/.well-known/mercure
    # The public URL of the Mercure hub, used by the browser to connect
    MERCURE_PUBLIC_URL=https://127.0.0.1:8000/.well-known/mercure
    # The secret used to sign the JWTs
    MERCURE_JWT_SECRET="secret"
###< symfony/mercure-bundle ###
 

я использую настоящий секрет JWT только для примера([JWT.io])2.

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

с моим секретным паролем.

я создаю файл js с источником событий.

 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));
}
 

и я хотел бы, чтобы уведомление отправлялось, когда кто-нибудь получит доступ к заказу на повторный просмотр : http://127.0.0.1:8000/commande/recapitulatif.
В моем контроллере, когда адрес http://127.0.0.1:8000/commande/recapitulatif это вызов, который я добавляю:

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

        $hub->publish($update);
 

на странице, где мне нужно получить уведомление и добавить код js, если я проверю соединение с mercure в сети разработчика приложений chrome, я увижу это:

 Request URL: http://127.0.0.1:8000/.well-known/mercure?topic=http://127.0.0.1:8000/commande/recapitulatif
Request Method: GET
Status Code: 200 OK
Remote Address: 127.0.0.1:8000
Referrer Policy: strict-origin-when-cross-origin
 

but when i try to go to the url http://127.0.0.1:8000/commande/recapitulatif i have an error (Failed to send an update) and (SSL connect error for «https://127.0.0.1:8000/.well-known/mercure».)

Update:
i change

 MERCURE_URL=https://127.0.0.1:8000/.well-known/mercure

MERCURE_PUBLIC_URL=https://127.0.0.1:8000/.well-known/mercure
 

to

 MERCURE_URL=http://127.0.0.1:8000/.well-known/mercure

MERCURE_PUBLIC_URL=http://127.0.0.1:8000/.well-known/mercure
 

and now with the error (failed to send an update) i have (HTTP/1.1 401 Unauthorized returned for «http://127.0.0.1:8000/.well-known/mercure».)

probably i need to put my app to https for have a ssl connection with mercure ?

An other try.
i replace hhttp where i change https to http to my .env and js file.
After that i change the code in my controller like this:

  $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'])
    );
 

Теперь у меня нет ошибки, но моему браузеру ничего не сообщается.

мой журнал для страницы, на которой я хочу получить уведомление:

 [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"
 

и журнал, в который мне нужно отправить уведомление:

 [Application] Jun 26 17:36:06 |DEBUG  | SECURI Stored the security token in the session. key="_security_main"
[Web Server ] Jun 26 19:36:06 |INFO   | SERVER POST (200) /commande/recapitulatif host="127.0.0.1:8004" ip="127.0.0.1" scheme="https"
[Application] Jun 26 17:36:07 |INFO   | REQUES Matched route "_wdt". method="GET" request_uri="http://127.0.0.1:8000/_wdt/d13a0f" route="_wdt" route_parameters={"_controller":"web_profiler.controller.profiler::toolbarAction","_route
":"_wdt","token":"d13a0f"}
[Web Server ] Jun 26 19:36:08 |INFO   | SERVER GET  (200) /_wdt/d13a0f ip="127.0.0.1"
 

но если я добавлю обновление вот так:

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

            $hub->publish($update);
 

мой журнал выглядит так:

 [Application] Jun 26 18:02:39 |INFO   | HTTP_C Request: "POST http://127.0.0.1:8000/.well-known/mercure"
[Application] Jun 26 18:02:39 |INFO   | HTTP_C Response: "401 http://127.0.0.1:8000/.well-known/mercure"
[Application] Jun 26 18:02:39 |CRITICA| REQUES Uncaught PHP Exception SymfonyComponentMercureExceptionRuntimeException: "Failed to send an update." at C:laragonwwwProjetRestaurantRelaisDesVoutesvendorsymfonymercuresrcH
ub.php line 104
[Web Server ] Jun 26 20:02:39 |INFO   | MERCUR Topic selectors not matched, not provided or authorization error
[Web Server ] Jun 26 20:02:39 |WARN   | SERVER POST (401) /.well-known/mercure host="127.0.0.1:8004" ip="127.0.0.1" scheme="https"
[Application] Jun 26 18:02:39 |DEBUG  | SECURI Stored the security token in the session. key="_security_main"
[Web Server ] Jun 26 20:02:39 |ERROR  | SERVER POST (500) /commande/recapitulatif host="127.0.0.1:8004" ip="127.0.0.1" scheme="https"
 

Если кто-нибудь может помочь мне понять, в чем моя проблема, большое вам спасибо.

Ответ №1:

Я предполагаю, что у вас запущен и установлен отдельный двоичный файл Mercure. Вы не можете одновременно запускать двоичный файл Mercure и Symfony на порту 8000 вместе. В зависимости от вашей версии (я использую Mercure v0.9.0 из-за руководства, которому я следовал), вам может сойти с рук создание файла Makefile, подобного этому

 mercure_server:
    JWT_KEY=my_key ADDR=localhost:3000 ALLOW_ANONYMOUS=1 CORS_ALLOWED_ORIGINS=http://localhost:8000 ./bin/mercure
 

Затем побежал make mercure_server

Это предполагает, что у вас есть двоичный файл mercure в каталоге bin вашего проекта. Эта команда не будет работать с последней версией Mercure, потому что переменные среды задаются иначе.

Более новая версия двоичного файла Mercure использует модифицированную версию веб-сервера Caddy, и совместимость с Symfony не очень хорошо документирована из того, что я читал до сих пор. Я бы рассмотрел возможность понижения до версии 0.9.0, если вы находитесь в затруднительном положении, потому что для этого доступно больше ресурсов.