Symfony Mercure: EventSource не отправляет cookie - PullRequest
0 голосов
/ 21 марта 2020

С Symfony Mercure , я хочу отправить повару ie авторизация:

Я запускаю свой сервер Mercure с помощью этой команды:

mercure/mercure.exe --jwt-key='...jwtToken...' --addr='localhost:3000' --allow-anonymous --cors-allowed-origins='https://127.0.0.1:8000'

И вот как я пытаюсь отправить Повара ie withCredentials: true:

const url = new URL('http://localhost:3000/.well-known/mercure')
url.searchParams.append('topic', 'https://bubble.com/message')

const eventSource = new EventSource(url, { withCredentials: true })

На моей текущей странице https://127.0.0.1:8000/message, в консоли я вижу повара ie:

set-cook ie: mercureAuthorization = ... cookieValue ...; . Путь = / хорошо известно / Mercure; обеспечения; HttpOnly; samesite = lax

Но повар ie никогда не отправляется . В моей консоли, на вкладке сети, я вижу запрос источника событий http://localhost:3000/.well-known/mercure?topic=https%3A%2F%2Fbubble.com%2Fmessage, но повар ie никогда не передается.

Я пытался изменить secure=false и samesite=none, но повар ie никогда не передается.

Вот информация из запроса источника событий (Mercure Hub):

enter image description here

1 Ответ

0 голосов
/ 20 апреля 2020

Недавно я потратил несколько часов, чтобы заставить его работать под Chrome (в Firefox У меня не было проблем с созданием и отправкой файлов cookie):

  • Реакция: 127.0.0.1: 3000
  • Symfony API: 127.0.0.1:8000
  • Mercure: 127.0.0.1:5000

Обратите внимание, что я не могу заставить его работать, используя Адрес локального хоста (cook ie не был установлен / отправлен для аутентификации):

  1. Запустите Mercure и назначьте источники для Front App (вместо '*'):
mercure --jwt-key=aVerySecretKey --addr=127.0.0.1:5000 --allow-anonymous --cors-allowed-origins=http://127.0.0.1:3000
В React, пожалуйста, настройте Rest Api address:
REACT_APP_SERVER_ROOT=http://127.0.0.1:8000 
В Symfony установите конфигурацию, как показано ниже:
###> MERCURE_JWT_KEY ###
MERCURE_JWT_KEY=aVerySecretKey
###< MERCURE_JWT_KEY ###

###> symfony/mercure-bundle ###
MERCURE_PUBLISH_URL=http://127.0.0.1:5000/.well-known/mercure
MERCURE_JWT_TOKEN=your_secret_jwt_token
###< symfony/mercure-bundle ###
В Symfony создайте CookieGenerator и сгенерируйте Cook ie, как показано ниже:
    $token = (new Builder())
    ->withClaim(
        'mercure',
         //Using UserId will help to define the targets on publish action
         ['subscribe' => ["http://127.0.0.1/user/{$user->getId()}"]]
    )
    ->getToken(new Sha256(), new Key($this->secret));

    //ATT: As you work in local environment Localhost, path needs to be '' 
    //otherwise Chrome won't setup the cookie. In Firefox this seems not to be a problem
    return Cookie::create('mercureAuthorization', $token, 0, '');
    //THIS WONT WORK: return Cookie::create('mercureAuthorization', $token, 0, '/.well-known/mercue');
Наконец, в React создаётся источник событий, который будет отправлять автоматически созданного Кука ie - не забудьте добавить {withCredentials: true}
     // URL is a built-in JavaScript class to manipulate URLs
     const url = new URL('http://127.0.0.1:5000/.well-known/mercure');
     url.searchParams.append('topic', 'http://127.0.0.1/your_topic/{id}') ;

     const eventSource = new EventSource(url, {withCredentials: true});
     eventSource.onmessage = event => {
         console.log(JSON.parse(event.data));
     }

Надеюсь, что это может быть полезно и сэкономит вам время .

...