Mercure + Angular + Symfony >>> все на локальной машине - PullRequest
0 голосов
/ 06 ноября 2019

Я локально на Mac OS 10.14.6, использую Angular 8, Symfony 4.3 и mercure 0.72 darwin. Я совсем новичок в Symfony. Я хотел отправлять обновления только авторизованным клиентам на моем локальном компьютере. Пока что это действительно большая боль. Я надеюсь, что смогу найти помощь или ответы здесь.

Последняя ошибка, которую я получаю:

http: TLS handshake error from ip:55289: acme/autocert: unable to authorize "mydyndns-url.com"; challenge "http-01" failed with error: acme: authorization error for mydyndns-url.com: 400 urn:acme:error:connection: Fetching http://mydyndns-url.com/.well-known/acme-challenge/SomeHash: Error getting validation data; challenge "tls-alpn-01" failed with error: acme: authorization error for mydyndns-url.com: 400 urn:acme:error:connection: Connection refused

плюс

http: TLS handshake error from ip:56803: acme/autocert: missing certificate

У меня нетудаленный сервер, на котором я мог проверить что угодно. Но я хочу отправить некоторые обновления авторизованным клиентам. У меня нет возможности проверить это локально? без всякой чепухи? Пока, если я правильно понимаю, для использования авторизации в клиентах (cookie или на предъявителя) у меня должен быть зашифрованный обмен данными Mercure, для этого мне нужен сертификат, который я создал с помощью letsencrypt для моего URL-адреса dyndns, который я также только что создал для этого, нозатем я также прочитал, что для авторизации с шифрованием все должно работать на 443, но все на одной машине, так что мне нужно сейчас создавать субдомены для всех моих локальных тестовых серверов? (поскольку у моего dyndns есть проблема при создании сертификата с использованием sudo certbot certonly --standalone, из-за этого мне не удалось выполнить вызов для моих поддоменов, являющихся затем поддоменами поставщика dyndns), а также почему он пытается получить сервер: 80 дляразрешение с хорошо известным путем?

Но так как я чувствую, что прошел через кроличью нору и что у него нет конца, я не знаю, имеет ли какой-либо смысл пытаться что-либо с помощью ртути.

Я просто хочу отправить сообщение в '/ messages' для target '/ user / patata', а затем аутентифицировать его в моем угловом клиенте с помощью cookie. Это так сложно сделать на локальном сервере разработки? Есть ли какой-нибудь полный документ для этого варианта использования?

Использование этого для запуска mercure

sudo PUBLISHER_JWT_KEY='mercure_key' SUBSCRIBER_JWT_KEY='mercure_key' JWT_KEY='mercure_key' ACME_HOSTS='mydyndns-url.com' ADDR='mydyndns-url.com:443' CERT_FILE='/Users/me/Projects/fullchain.pem' KEY_FILE='/Users/me/Projects/privkey.pem' CORS_ALLOWED_ORIGINS='*' ALLOW_ANONYMOUS='1' debug='1' ./mercure

Конечно, есть также настройки Symfony, код и угловой код и так далее. Но это было бы слишком много, чтобы положить все здесь. И в основном я хотел бы знать, как это легко усложнить, чтобы не вызывать головокружение: D

1 Ответ

0 голосов
/ 07 ноября 2019

ОК, мне удалось ее решить (пока не идеально, но работает, и все равно только для разработки).

  • Конечно, я сгенерировал свой 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>
  • В Symfony я настраиваю:
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.

Но если у вас есть предложения, жалобы, предупреждения, улучшения, пожалуйста, дайте мне знать !!

...