Symfony / Mercure вопрос: 2 пользователя с одной собственной целью могут видеть предположительно зацикленные сообщения друг друга - PullRequest
0 голосов
/ 06 февраля 2020

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

...