ОК, мне удалось ее решить (пока не идеально, но работает, и все равно только для разработки).
- Конечно, я сгенерировал свой JWT https://jwt.io/#debugger-io
- Следовал настройке mercure для symfony https://symfony.com/doc/current/mercure.html#running-a-mercure-hub
- В Symfony установлен
composer require symfony/mercure-bundle
- Я сам получил dyndns с подстановочным знаком из https://www.dynu.com/
- Я настроил свой маршрутизатор(
fritzbox
) до forward port 80 and 443
http. (временно, только для создания сертификата certbot !!!) - Я позвонил
sudo ifconfig lo0 alias [public IP] up
- Я добавил три субдомена моего домена dyndns в мой файл / etc / hosts
(client.mydomain.dynu.org,api.mydomain.dynu.org,hub.mydomain.dynu.org)
, связанный смой публичный IP. - Я использовал certbot letsencrypt с
sudo certbot certonly --standalone
и создал один сертификат для 4 доменов (client.mydomain.dynu.org,api.mydomain.dynu.org,hub.mydomain.dynu.org,mydomain.dynu.org)
- Затем я изменил свой файл / etc / hosts и привязал все 4 домена к 127.0.0.1
- Я настроил свой apache для загрузки подключаемых модулей прокси
LoadModule proxy_module lib/httpd/modules/mod_proxy.so
LoadModule proxy_http_module lib/httpd/modules/mod_proxy_http.so
- Я установил свой apache с виртуальным хостом для моей Symfony
api.
и angular client.
поддоменов (я не использую symfony server:start
)
<VirtualHost api.mydomain.dynu.org:443>
DocumentRoot "/Users/me/Sites/api/public"
ServerName api.mydomain.dynu.org
SSLEngine on
SSLCertificateFile "/Users/me/Projects/mydomain.dynu.org.crt"
SSLCertificateKeyFile "/Users/me/Projects/mydomain.dynu.org.key"
ErrorLog "/Users/me/Sites/api/error_log"
CustomLog "/Users/me/Sites/api/access_log" common
</VirtualHost>
<VirtualHost client.mydomain.dynu.org:443>
ServerName client.mydomain.dynu.org
SSLEngine On
SSLProxyEngine On
ProxyRequests Off
SSLCertificateFile "/Users/me/Projects/mydomain.dynu.org.crt"
SSLCertificateKeyFile "/Users/me/Projects/mydomain.dynu.org.key"
ProxyPass / http://client.mydomain.dynu.org:444/
ProxyPassReverse / http://client.mydomain.dynu.org:444/
</VirtualHost>
<VirtualHost hub.mydomain.dynu.org:443>
ServerName hub.mydomain.dynu.org
SSLEngine On
SSLProxyEngine On
ProxyRequests Off
SSLCertificateFile "/Users/me/Projects/mydomain.dynu.crt"
SSLCertificateKeyFile "/Users/me/Projects/mydomain.dynu.key"
ProxyPass / http://hub.mydomain.dynu.org:445/
ProxyPassReverse / http://hub.mydomain.dynu.org:445/
</VirtualHost>
in '.env':
MERCURE_PUBLISH_URL=https://hub.mydomain.dynu.org:443/hub
CORS_ALLOW_ORIGIN=^https://client.mydomain.dynu.org$
in 'nelmio_cors.yaml':
nelmio_cors:
defaults:
...
origin_regex: true
paths:
...
'^/api/':
allow_origin: ['^https://client.mydomain.dynu.org']
allow_headers: ['Content-Type', 'Authorization']
allow_methods: ['POST', 'PUT', 'GET', 'DELETE', 'OPTIONS']
max_age: 3600
...
В angular я использую EventSourcePolyfill, как описано здесь https://www.npmjs.com/package/event-source-polyfill для передачи токена Bearer, но мне нужно было изменить исходный файл, чтобы EventSourcePolyfill был привязан к глобальной (это окно) переменной, потому что я просто не знаю, какобрабатывать эти не .ts файлы лучше до сих пор. (может кто-то может предложить реальное решение)
токен, который я генерирую в symfony
$username = $this->getUser()->getUsername(); // Retrieve the username of the current user
$token = (new Builder())
// set other appropriate JWT claims, such as an expiration date
->withClaim('mercure', ['subscribe' => ["/user/patata"], 'publish' => ['*']]) // could also include the security roles, or anything else
->sign(new Sha256(), 'mercure_key') // don't forget to set this parameter! Test value: aVerySecretKey
->getToken();
$response = $this->json(['token' => sprintf('%s', $token)]);
Я запускаюугловой на порту 444 sudo ng serve --host client.mydomain.dynu.org --port 444
, обратный прокси-сервер apache пересылает все запросы на 443 к этому
Я запускаю Mercure, используя
sudo PUBLISHER_JWT_KEY='mercure_key' SUBSCRIBER_JWT_KEY='mercure_key' \
JWT_KEY='mercure_key' ADDR='hub.mydomain.dynu.org:445' \
CORS_ALLOWED_ORIGINS='*' ALLOW_ANONYMOUS='1' DEBUG='1' ./mercure
Следуйте всему вышесказанному с осторожностью: - Я новичок в Symfony, всегда раньше использовал flowframework. - Мне никогда раньше не приходилось иметь дело с настройкой или настройкой сертификатов - И мне никогда не приходилось иметь дело с настройкой шифрования, без JWT, без обратного прокси-сервера apache.
История:
Я попробовал токен cookie cookie Mercureраньше, но это не сработало, и где-то было написано, что для этого нужно включить шифрование, так что для меня это означало путь к сертификатам, но самогенерация не помогла, и вместо этого я прочитал об использовании letsencrypt, поэтому я решил, чтоКстати, до тех пор, пока я где-то не прочитал, что letsencrypt работает только на 443, и поэтому я читал о прокси-серверах и пошел по этому пути, не уверенный, действительно ли это так.
Прямо сейчас у меня будут новые идеи без сертификатов и прочего,что я бы попробовал в начале, но все работает сейчас, и я могу развиваться снова, и это все, что я хотел. И так я узнал, как создавать сертификаты letsencrypt, об обратных прокси-серверах и для чего предназначен acme: D.
Но если у вас есть предложения, жалобы, предупреждения, улучшения, пожалуйста, дайте мне знать !!