В этой серии мы узнали о каналах от 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 невероятно легко добавить безопасное общение в реальном времени в ваши приложения, и для этого даже не требуется много кода!