Chat en temps réel avec Laravel et Pusher
Si vous souhaitez créer le prochain concurrent de Slack ou diffuser plus humblement des événements à plusieurs utilisateurs et éventuellement à une autre application telle qu'une application React Native, vous devrez peut-être envisager d'utiliser Pusher. Pusher est un service très pratique pour effectuer du pub / sub. Il vous évite de devoir maintenir votre propre serveur WebSocket utilisant un pilote Redis ou SNS.
Dans cet article, je vais vous montrer comment gérer la publication de messages de conversation dans Pusher et comment vous abonner à ces messages de manière sécurisée en frontend à l'aide de canaux privés.
Introduction
Nous allons supposer que notre application Laravel est simplement une API REST, avec une authentification Passport, et que nous souhaitons implémenter l’interface du chat dans une application JS externe.
Premièrement, nous allons installer le SDK Pusher avec $ composer require pusher/pusher-php-server "~3.0" et le configurer dans config/broadcast.php.
Supposons maintenant que nous ayons les modèles Conversation etMessage suivants:
Le modèle Message:
Quelque part dans votre code, vous allez gérer le stockage des messages de conversation.
Lorsqu'un nouveau message est ajouté à une conversation, vous allez déclencher un événement:
Canaux privés
Le but de l'application est de diffuser des messages de conversation vers l'application frontend, de manière sécurisée.
Nous ne voulons pas que les autres utilisateurs puissent voir les messages des autres conversations. Nous allons donc diffuser les événements de message sur un canal de notification privé.
Chaque conversation aura son canal dédié appelé private-conversation.{id}.
Le préfixe private- est une convention Pusher pour nommer les canaux privés
Sur ces canaux, nous allons diffuser un événement message.posted lorsqu'un nouveau message est posté dans une conversation, afin que notre frontend puisse l'écouter et mettre à jour l'interface utilisateur en conséquence.
Backend
Pour cela, nous allons implémenter notre événement MessagePosted qui est déclenché à chaque fois qu'un nouveau message est posté:
Nous devons également spécifier qui peut rejoindre ce canal, dans notre cas, seuls les utilisateurs appartenant à la conversation. Pour cela, nous allons créer une classe Channel personnalisée et implémenter la méthode join():
Une fois que c'est fait, nous devons configurer notre route, en utilisant cette nouvelle classe.
La diffusion sur des canaux privés nécessite une authentification, mais grâce au package Broadcast de Laravel, le contrôleur d’authentification est déjà géré pour nous. Nous devons simplement configurer ces routes dans le service provider:
Notez que j'utilise le middleware auth:api ici, car c'est le middleware que j'utilise pour authentifier les utilisateurs d'API. L'utilisation de canaux privés requiert une authentification. Vous devez donc utiliser le middleware approprié en fonction de la méthode d'authentification utilisée pour votre API. Si votre application web ne se trouve pas sur le même domaine, par exemple une application React Native, vous devez configurer un middleware CORS pour ces routes.
Vous pouvez installer https://github.com/barryvdh/laravel-cors et mettre à jour votre $routeMiddleware en ajoutant:
Ensuite, mettez à jour les routes pour utiliser le nouveau middleware:
Si l'application front se trouve sur un domaine différent, vous pouvez également ne pas avoir accès aux jetons CSRF. Par conséquent, vous désactiverez probablement le contrôle CSRF pour la route d'authentification:
Frontend
Sur le frontend, nous devons donner à Pusher l'endpoint pour l'authentification à l'aide de la propriété authEndpoint et éventuellement ajouter des en-têtes supplémentaires pour l'authentification. Par exemple, si vous utilisez Passport, vous passerez un en-tête Authorization contenant le jeton récupéré précédemment au cours du processus d'authentification. L'id de la conversation sera également récupéré plus tôt, par exemple lorsque l'utilisateur ouvre la conversation. Notre pseudo-code pour s'abonner aux messages de conversation devient:
Pusher utilisera maintenant l'endpoint spécifié pour effectuer l'authentification des utilisateurs à l'aide des en-têtes que nous avons configurés. Seuls les utilisateurs appartenant à la conversation pourront s'abonner et recevoir des événements lorsqu'un nouveau message est publié. C'est tout! Vous pouvez maintenant créer d'autres événements et les diffuser sur ce canal, par exemple, lorsqu'un message est supprimé ou lorsque l'utilisateur est en train d'écrire.