Я создал страницу чата, где вошедший в систему пользователь должен видеть только свои собственные сообщения через отдельные цели. Тем не менее, каждый пользователь может видеть сообщения других пользователей, предположительно самоназначенные (зацикленные). Каждый вошедший в систему пользователь отправляет свой собственный JWT с:
$this->denyAccessUnlessGranted('ROLE_USER');
$user = $this->getUser();
$userid = $user->getId();
$pass = $user->getPassword();
$token = (new Builder())
// set other appropriate JWT claims, such as an expiration date
->set('mercure', ['subscribe' => ["http://localhost:8000/user/".$userid],'publish' => ["http://localhost:8000/user/".$userid]]) // could also include the security roles, or anything else
->sign(new Sha256(), 'K3y')
->getToken();
return $this->render('chat/index.html.twig', [
'config' => [
'topic' => 'chat',
'publishRoute' => $this->generateUrl('publisher', ['topic' => 'chat'])
], 'token' => $token
]);
JS на странице чата пользователя выглядит так:
<script src="js/eventsource.min.js"></script>
<script>
const {topic, publishRoute} = JSON.parse(document.getElementById('config').textContent);
const subscribeURL = new URL('http://localhost:3000/.well-known/mercure');
subscribeURL.searchParams.append('topic', topic);
const es = new EventSourcePolyfill(subscribeURL, {
headers: {
'Authorization': 'Bearer ' + '{{ token }}',
}
});
let ul = null;
es.onmessage = ({data}) => {
const {username, message} = JSON.parse(data)
if (!username || !message)
throw new Error('Invalid payload')
if (!ul) {
ul = document.createElement('ul');
const messages = document.getElementById('messages');
messages.innerHTML = '';
messages.append(ul);
}
const li = document.createElement('li')
li.append(document.createTextNode(`<${username}> ${message}`))
ul.append(li)
};
document.querySelector('form').onsubmit = function (e) {
e.preventDefault();
fetch(publishRoute, {method: 'POST', body: JSON.stringify({username: this.elements.username.value, message: this.elements.message.value})});
this.elements.message.value = '';
this.elements.message.focus();
}
</script>
URL-адрес страницы чата http://localhost: 8000 / чат однажды зарегистрировал его.
И параметры моего концентратора Mercure таковы:
$env:JWT_KEY='K3y'; $env:ADDR='localhost:3000'; $env:ALLOW_ANONYMOUS='0'; $env:CORS_ALLOWED_ORIGINS='http://localhost:8000'; $env:PUBLISH_ALLOWED_ORIGINS='http://localhost:3000'; .\mercure.exe
Пожалуйста, помогите! Я использовал JWT для каждого пользователя, но безопасность для изоляции обновлений не работает: /