Erste Schritte mit Pusher Verwenden privater Kanäle

In dieser Serie haben wir uns mit Channels von Pusher vertraut gemacht, einer Plattform, mit der Sie Ihren Benutzern das nahtlose Echtzeiterlebnis bieten können, das sie möchten. 

Private Kanäle bieten Ihren Anwendungen ein sicheres, privates Medium für die Veröffentlichung von Nachrichten. Das Beste ist, wie einfach es ist, private Kanäle für Ihre Apps zu implementieren und zu verwenden. In diesem Beitrag erfahren Sie, wie man sie benutzt. 

 

Eine bessere Chat-App

In dem vorherigen Video haben wir uns eine sehr einfache Chat-Anwendung angesehen, die keine Benutzer und keine Sicherheit hatte. Es war nur ein anonymer Chat. Es funktioniert, versteh mich nicht falsch, aber wir können es besser machen! In diesem Video betrachten wir eine etwas andere Version dieser Chat-Anwendung. Das Frontend ist größtenteils gleich, das Backend ist jedoch eine Laravel-Anwendung.

Einrichten des Servers

Obwohl die App von Laravel betrieben wird, werden die gleichen Prinzipien für den Umgang mit unseren Nachrichten verwendet. Anstelle einer einzelnen Datei haben wir jetzt eine ChannelsController um mit unseren Channels-orientierten Sachen umzugehen, und es hat eine Nachricht senden() Methode, die eingehende Chat-Anforderungen vom Client verarbeitet. Sie können den Code unten sehen:

öffentliche Funktion sendMessage (Request $ request) if (! Auth :: check ()) return new Antwort ('Forbidden', 403);  $ data = $ request-> json () -> all (); $ data ['user'] = Auth :: user () -> name; $ this-> pusher-> trigger ('anon-chat', 'send-message', $ data); 

Ich möchte unseren Chat so schützen, dass nur authentifizierte Benutzer darauf zugreifen können, und Sie können im obigen Code sehen, dass er prüft, ob der Benutzer authentifiziert ist, bevor er das auslöst Nachricht senden Veranstaltung. Dies ist ein guter Anfang, aber es reicht nicht aus, um unseren Chat vollständig zu schützen, denn jeder, der Zugriff auf unsere Anwendungsschlüssel- und Clusterinformationen hat, kann potenziell Nachrichten abonnieren und abhören, die über die öffentlichen Kanäle unserer Anwendung gesendet werden. Um unseren Chat vollständig zu schützen, müssen wir zum Senden unserer Nachrichten einen privaten Kanal verwenden. Als ersten Schritt erstellen Sie einen privaten Kanal.

Um einen privaten Kanal zu erstellen, lösen wir einfach ein Ereignis auf einem Kanal mit ein Privatgelände- Präfix. So können wir den vorherigen Anruf in ändern auslösen() der folgende Code sein:

$ this-> pusher-> trigger ('private-chat', 'send-message', $ data);

Dieser Code sendet nun unsere Nachrichten über die privater Chat Kanal, und aus Sicht des Servers ist dies das einzige, was der Server benötigt, um Nachrichten über einen privaten Kanal zu senden. Die Clients müssen sich jedoch authentifizieren, um einen privaten Kanal abonnieren zu können, indem sie Anforderungen an einen spezialisierten Endpunkt senden.

Clientautorisierungsendpunkt schreiben

Wenn eine Clientbibliothek versucht, einen privaten Kanal zu abonnieren, gibt sie eine POST-Anforderung an einen Autorisierungsendpunkt aus. Dieser Endpunkt hat einen einzigen Job: Ermittelt, ob der Benutzer authentifiziert ist und antwortet mit einer entsprechenden Antwort. Eine neue Methode aufgerufen authorizeUser () wird diese Anfrage bearbeiten, und der Code ist sehr einfach.

public function authorizeUser (Request $ request) if (! Auth :: check ()) neue Antwort zurückgeben ('Forbidden', 403);  echo $ this-> pusher-> socket_auth ($ request-> input ('channel_name'), $ request-> input ('socket_id')); 

Es prüft zuerst den Authentifizierungsstatus des Benutzers und antwortet mit 403 Forbidden, wenn der Benutzer nicht angemeldet ist. Wenn jedoch die Authentifizierungsprüfung des Benutzers besteht, wird die Authentifizierung bestanden authorizeUser () Die Methode muss einen speziellen Wert ausgeben, der von zwei Werten aus dem Hauptteil der Anforderung abgeleitet wird. 

Die Ausgabe wird von der Pusher-Bibliothek generiert socket_auth () Methode, wie im obigen Code gezeigt. Wenn die resultierende Ausgabe mit dem von der Clientbibliothek erwarteten Wert übereinstimmt, wird der Client authentifiziert und kann den privaten Kanal abonnieren. 

Zum Glück ist dieser ganze Prozess automatisiert. Wir müssen lediglich den Client so konfigurieren, dass Autorisierungsanforderungen an diesen Endpunkt gesendet werden.

Client konfigurieren

Wenn Sie ein erstellen Pusher Als Objekt für die Clientbibliothek können Sie das resultierende Objekt so konfigurieren, dass Authentifizierungsanforderungen an einen bestimmten Endpunkt gesendet werden. Fügen Sie einfach ein authEndpoint Option und setzen Sie sie auf die URL Ihres Endpunkts (siehe folgenden Code).

let pusher = new Pusher ('427017da1bd2036904f3', authEndpoint: '/ channels / authorize'), Cluster: 'us2', verschlüsselt: true, auth: Header: 'X-CSRF-Token': this.csrfToken ); let channel = pusher.subscribe ('private-chat');

Sie können auch beliebige Authentifizierungsheader mit festlegen Auth Möglichkeit. Dieser Code setzt die X-CSRF-Token Header, um Angriffe über standortübergreifende Anfragen zu verhindern.

Wenn der Client nun versucht, einen privaten Kanal zu abonnieren, wird er sich mit der angegebenen Endpunkt-URL authentifizieren und den Zugriff auf den Kanal basierend auf der Antwort zulassen oder verweigern.

Fazit

Die Verwendung privater Kanäle erhöht die Sicherheit Ihrer Anwendung erheblich, und die Konfiguration Ihrer Anwendungen für deren Verwendung ist ein Kinderspiel. Mit Channels von Pusher ist es unglaublich einfach, Ihren Apps eine sichere Echtzeitkommunikation hinzuzufügen, und es ist nicht einmal viel Code erforderlich!