Недавно я потратил несколько часов, чтобы заставить его работать под Chrome (в Firefox У меня не было проблем с созданием и отправкой файлов cookie):
- Реакция: 127.0.0.1: 3000
- Symfony API: 127.0.0.1:8000
- Mercure: 127.0.0.1:5000
Обратите внимание, что я не могу заставить его работать, используя Адрес локального хоста (cook ie не был установлен / отправлен для аутентификации):
- Запустите 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));
}
Надеюсь, что это может быть полезно и сэкономит вам время .