2015-07-05 19 views
7

Ich möchte socket.io-Clients anhand von Clientsitzungsdaten authentifizieren, die von Laravel erstellt wurden.Laravel 5: Socket.io-Clientauthentifizierung mit Laravel-Sitzungsdaten

Was ich gedacht habe ist von:

A - Emissionsbenutzernamen und E-Mail vom Client zum Server;

B - Speichern der Daten, die mein socket.io-Server in Redis in php benötigt, nachdem sich der Benutzer anmeldet und dann in Node.js basierend auf der Session-Cookie-ID liest. Ich werde wahrscheinlich in Redis sessionId -> "email, name" speichern müssen, wenn ich diesen Ansatz bevorzuge.

C - Verwenden des Redis-Sitzungstreibers in Laravel, Dekodieren von Cookies, die von Laravel gesetzt wurden, Zugreifen auf Laravel-Sitzungswerte von Node.js, unserialisieren und entschlüsseln;

Ansatz A ist offensichtlich sehr unsicher und könnte nur verwendet werden, um das Konzept zu beweisen.

Ansatz C scheint besser zu sein, da ich Sitzungsdaten nicht duplizieren oder verwalten muss, sondern nur um sie zu dekodieren. Dieser Weg verbindet jedoch meine Anwendung mit den Implementierungsdetails von Laravel-verwalteten Sitzungen und scheint daher nicht angemessen zu sein.

Ansatz B sieht vielversprechender aus und ist einfacher zu implementieren. Aber mit Ansatz B bedeutet, dass ich einige Sitzungsdaten selbst verwalten muss, damit socket.io es lesen kann. Dies kann dazu führen, dass Laravel-Sitzungsdaten und Sitzungsdaten, die ich in Redis speichere, widersprüchlich sind und dies zu einem bestimmten Zeitpunkt geschehen wird. Im Extremfall kann zum Beispiel eine abgelaufene Session-ID wiederverwendet werden und ein socket.io-Client wird fälschlicherweise als ein anderer Benutzer authentifiziert. Ich kann mir in diesem Moment keinen trivialeren Fall vorstellen, aber aufgrund dieser Inkonsistenz gehe ich davon aus, dass es einen solchen Fall gibt, und sowohl Sicherheit als auch UX könnten kompromittiert werden.

Was ist eine elegantere, robustere und sichere Möglichkeit, eine Benutzerauthentifizierung basierend auf Laravel-Sitzungsdaten in der socket.io-Anwendung zu erreichen? Wenn es keine drastisch besseren Ansätze gibt und ich nehme an, Ansatz B ist das Beste, was ich tun könnte, um die Konsistenz zwischen den Sitzungsdaten zu verbessern, die ich mit Redis- und Laravel-Sitzungsdaten verwalte.

Der ganze Punkt, so weit ich zusammenfassen kann, ist der Zugriff auf Laravel-Session-Daten außerhalb von Laravel und PHP und die Identifizierung von Clients nach Session-ID, E-Mail und Benutzername.

Antwort

6

Ich empfehle Ihnen, JSON Web Token-Authentifizierung zu verwenden.

JSON-Web-Token (JWt) ist ein relativ neues Token-Format, das in Umgebungen mit begrenztem Speicherplatz wie HTTP-Autorisierungsheadern verwendet wird. JWT ist als eine Methode zur Übertragung von Sicherheitsansprüchen zwischen Parteien aufgebaut. More detailed info about JWT

Der einfachste Weg, dies mit Laravel zu tun, ist die Verwendung eines Pakets wie this one. Oder Sie können es von Ihrem Server implementieren.

Mit JWT auth können Sie vom Token auf den Benutzer zugreifen. Zum Beispiel:

$user = JWTAuth::parseToken()->toUser(); 

Für detailierte Informationen über die 'jwt-Auth' zu verwenden, werfen Sie einen Blick here.

+2

Es scheint wie viel besser Ansatz als was ich dachte. Ich habe von JWT gelesen und bin auf die Idee gekommen. Es wäre jedoch großartig, wenn Sie Ihre Antwort ein wenig erweitern und erklären, warum JWT gut für die Authentifizierung von socket.io Clients funktioniert (falls jemand anders dieselbe Frage hat). –

+0

Ich habe gerade weitere Informationen über JWT hinzugefügt. –

0

Wie bereits von Alexandros erwähnt, sollten Sie JWT verwenden.

Authentifizieren Sie JWTs mit socket.io ist ein Kinderspiel. Sie könnten socketio-auth und wie sehr gut in diesem article beschrieben verwenden, um Ihre Benutzer zu authentifizieren. Außerdem können Sie dotenv verwenden, um den geheimen Schlüssel für die signierten Token aus der Laravel .env-Datei zu lesen.

Für mich funktioniert es gut, obwohl Sie an die Ungültigkeit der Token denken müssen. In Laravel kümmert sich jwt-auth darum, indem er eine Blacklist verwendet. Sie müssen das also in Ihrem Node-Server selbst erledigen. Oder halte die Lebenszeit kurz.

0

Ich hatte vor etwa einem Jahr eine gute Lösung dafür gefunden. Ich entschied mich dafür, es zu einem Modul zu machen, es ist wirklich einfach zu benutzen. hilft Ihnen, den Cookie zu bekommen, ohne ihn hart zu codieren. hilft Ihnen die Session-ID erhalten und von MySQL und Redis

https://www.npmjs.com/package/node-laravel-session

auf diese Weise abrufen Sie alle Ihre Sitzung gemeinsam nutzen können. Sie können auch die Sitzung verwenden, um einen Benutzer zu bestimmten Räumen zu registrieren