Статьи

Начало работы с Pusher: использование частных каналов

В этой серии мы узнали о каналах от Pusher , платформы, которая позволяет вам предоставлять своим пользователям бесперебойную работу в режиме реального времени, которую они хотят.

Частные каналы предоставляют вашим приложениям защищенный частный носитель для публикации сообщений. Самое приятное то, насколько легко реализовать и использовать частные каналы для ваших приложений. Вы узнаете, как использовать их в этом посте.

В предыдущем видео мы рассматривали очень простое приложение для чата, в котором не было пользователей и безопасности; это был просто анонимный чат. Это работает, не поймите меня неправильно, но мы можем сделать лучше! Итак, в этом видео мы рассмотрим немного другую версию этого приложения чата. Внешний интерфейс в основном такой же, но внутренний — приложение Laravel.

Несмотря на то, что приложение работает на Laravel, для обработки наших сообщений используются те же принципы. Вместо одного файла у нас теперь есть ChannelsController для обработки нашего материала, ориентированного на каналы, и он имеет метод sendMessage() который обрабатывает входящие запросы чата от клиента. Вы можете увидеть его код ниже:

01
02
03
04
05
06
07
08
09
10
11
public function sendMessage(Request $request) {
    if (!Auth::check()) {
        return new Response(‘Forbidden’, 403);
    }
 
    $data = $request->json()->all();
 
    $data[‘user’] = Auth::user()->name;
 
    $this->pusher->trigger(‘anon-chat’, ‘send-message’, $data);
}

Я хочу защитить наш чат, чтобы к нему могли получить доступ только аутентифицированные пользователи, и в приведенном выше коде видно, что он проверяет, прошел ли аутентификация пользователя, прежде чем инициирует событие send-message . Это хорошее начало, но этого недостаточно для полной защиты нашего чата, потому что любой, кто имеет доступ к ключу нашего приложения и информации о кластере, может подписаться и прослушать любые сообщения, отправленные по общедоступным каналам нашего приложения. Чтобы полностью защитить наш чат, нам нужно использовать частный канал для отправки наших сообщений, и первым шагом является создание частного канала.

Чтобы создать приватный канал, мы просто запускаем событие на канале с private- префиксом. Таким образом, мы можем изменить предыдущий вызов trigger() следующим кодом:

1
$this->pusher->trigger(‘private-chat’, ‘send-message’, $data);

Этот код теперь будет отправлять наши сообщения через канал private-chat , и с точки зрения сервера, это единственное, что нужно серверу для отправки сообщений по частному каналу. Однако клиентам необходимо пройти аутентификацию, чтобы подписаться на частный канал, и они делают это, отправляя запросы специализированной конечной точке.

Когда клиентская библиотека пытается подписаться на частный канал, она отправляет запрос POST конечной точке авторизации. Эта конечная точка имеет единственное задание: определить, прошел ли пользователь аутентификацию и ответить соответствующим ответом Новый метод authorizeUser() будет обрабатывать этот запрос, и его код очень прост.

01
02
03
04
05
06
07
08
09
10
public function authorizeUser(Request $request) {
    if (!Auth::check()) {
        return new Response(‘Forbidden’, 403);
    }
 
    echo $this->pusher->socket_auth(
        $request->input(‘channel_name’),
        $request->input(‘socket_id’)
    );
}

Сначала он проверяет состояние аутентификации пользователя и выдает 403 Запрещено, если пользователь не вошел в систему. Но если проверка аутентификации пользователя проходит, метод authorizeUser() должен вывести специальное значение, полученное из двух значений из запроса. тело.

Вывод генерируется методом socket_auth() библиотеки Pusher, как показано в приведенном выше коде. Если полученный результат соответствует значению, ожидаемому клиентской библиотекой, то клиент проходит проверку подлинности и может подписаться на частный канал.

К счастью, весь этот процесс автоматизирован; нам просто нужно настроить клиент для отправки запросов авторизации на эту конечную точку.

Когда вы создаете объект Pusher для клиентской библиотеки, вы можете настроить полученный объект так, чтобы он отправлял запросы на аутентификацию определенной конечной точке. Просто добавьте параметр authEndpoint и установите для него URL-адрес вашей конечной точки, как показано в следующем коде.

01
02
03
04
05
06
07
08
09
10
11
12
let pusher = new Pusher(‘427017da1bd2036904f3’, {
    authEndpoint: ‘/channels/authorize’,
    cluster: ‘us2’,
    encrypted: true,
    auth: {
        headers: {
            ‘X-CSRF-Token’: this.csrfToken
        }
    }
});
 
let channel = pusher.subscribe(‘private-chat’);

Вы также можете установить любые заголовки аутентификации с опцией auth . Этот код устанавливает заголовок X-CSRF-Token чтобы предотвратить атаки подделки межсайтовых запросов.

Теперь, когда клиент пытается подписаться на частный канал, он аутентифицируется с использованием предоставленного URL-адреса конечной точки и разрешает или запрещает доступ к каналу на основе ответа.

Использование частных каналов значительно повышает безопасность вашего приложения, и настройка ваших приложений для их использования очень просто. С каналами от Pusher невероятно легко добавить безопасное общение в реальном времени в ваши приложения, и для этого даже не требуется много кода!