Вопрос Symfony / Mercure: 2 пользователя с единственными целевыми объектами могут видеть сообщения друг друга, предположительно зацикленные
Я создал страницу чата, где зарегистрированный пользователь должен иметь возможность видеть только свои собственные сообщения через отдельные цели. Тем не менее, каждый пользователь может видеть сообщения любого другого пользователя, предположительно самовольные (зацикленные). Каждый вошедший в систему пользователь отправляет свой собственный 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/chat после входа в нее.
И параметры моего хаба 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 для каждого пользователя, но безопасность для изоляции обновлений не работает:/