2017-11-06 6 views
0

Das mag wie eine ziemlich noobish Frage scheinen, aber ich bin gerade in Node.js gekommen und wird benötigt, um sicherzustellen, dass die gleiche Art von Authentifizierung, die in meiner Laravel App geschieht in Node.js passiert.Authentifizieren von WebSocket-Verbindungen

Natürlich muss ich eine API verwenden, aber ich bin verwirrt, wie man es in einer Weise, die sicher ist, tut. Ich habe in diesen Artikel angesehen:

https://www.ida.liu.se/~TDP024/labs/hmacarticle.pdf

Und haben durch ihren Algorithmus in den Aufbau einer API sah. Aber ich verstehe nicht, wie es sicher wäre.

Gemäß dem Beitrag speichern Sie einen öffentlichen und privaten Schlüssel in einer Datenbank. Der öffentliche Schlüssel kann von jedem gesehen werden, aber der private Schlüssel ist privat. Wenn Sie es jedoch an den Server senden, senden Sie eine Hash-Version zusammen mit anderen Daten des privaten an den Server.

Das klingt alles gut und gut. Bedeutet das aber nicht, dass der öffentliche Schlüssel und der Hash öffentlich sind, also auch der private Schlüssel?

Zum Beispiel kann sagen, dass ich versuche, die folgende Verbindung

ws://example.com/pull?public=A89-3NJ2-KAN-NKSN1&hash=QmFzZTY0IHRoZSBoZWxsIG91dCBvZiBtZSBiYWJ5Li4uLi4u

zu etablieren Was von einem anderen Benutzer hält nur auf diesen Link teilt einen unabhängigen Benutzer des Zugriff darauf zu geben?

Antwort

0

Der Artikel, den Sie verknüpft haben, beschreibt, wie Sie eine einzige Anfrage authentifizieren, nicht eine ganze Sitzung. Das heißt, der Benutzer sendet die öffentlichen api_key zusammen mit einigen request Daten, die die spezifische Anfrage für die API beschreibt (wie { "action":"latest_price", "symbol":"GOOG"} für eine Börse API).

Zur Authentifizierung des Benutzers verwendet auch einen gemeinsamen API-Zugang Geheimschlüssel als Schlüssel HMACHMAC(secret, api_key+request) zu berechnen. Niemand kann das berechnen, wenn sie die secret nicht kennen. Nur der Benutzer und der Server sollten wissen, secret, weil es im Grunde das Kennwort des Benutzers ist, um die API zu verwenden.

Die Situation, die Sie beschreiben, ist sehr unterschiedlich: Sie verwenden einen WebSocket, also nehme ich an, dass Sie Anfragen interaktiv senden werden. Wenn Sie die gesamte Socket-Sitzung authentifizieren möchten, ist diese Vorgehensweise nicht sinnvoll, da sie eine einzelne Anforderung authentifizieren soll. Sie können diesen Ansatz auf einzelne Anforderungen innerhalb der WebSocket-Verbindung anwenden.

Zum Authentifizieren einer neuen Verbindung (d. H. "Welcher angemeldete Benutzer öffnet diese Verbindung?") Ist die Verwendung von auth-Cookies genauso wie bei einer herkömmlichen HTTP-Verbindung.


Unten Ich gehe davon aus, dass der Zweck der WebSocket ist nur eine Anfrage zu senden (das macht mich wirklich fragen, warum es eine WebSocket ist), so dass die Anforderungsebene Authentifizierung Sinn macht.

Was hält einen anderen Benutzer davon ab, nur diesen Link zu teilen, der einem unabhängigen Benutzer Zugriff darauf gibt?

Nichts.Möchten Sie, dass eine andere Person eine bestimmte Anfrage einreicht, während Sie sich für Sie ausgeben? Dann geben Sie ihnen auf jeden Fall diesen Link und sagen Sie ihnen, sie zu benutzen.

Die Anmeldeinformationen im Link enthalten einen HMAC der API-Anfrage (plus Ihrer Identität), die nur Sie als alleiniger Besitzer Ihres API-Geheimschlüssels generieren können. Wenn Sie diesen HMAC an jemand anderen weitergeben, können sie ihn einreichen und sich für diese spezielle Anfrage ausgeben. Sie können jedoch keine weiteren Anforderungen erstellen, da sie nicht über Ihr API-Geheimnis verfügen, um mehr HMAC-Werte für unterschiedliche Anforderungen zu erstellen.

In der Tat, wenn Sie nicht möchten, dass diese Anfrage eingereicht werden, sollten Sie nicht Ihr Geheimnis verwendet haben, um die Authentifizierung HMAC in erster Linie zu erstellen! Warum hat Sie eine Anfrage authentifiziert, die Sie nicht eingereicht haben?

+0

Das Problem ist, dass, wenn Sie einer anderen Person den Link geben, es ihnen den Zugang geben würde, einen WebSocket zu öffnen, zu dem sie sonst keine Erlaubnis hätten. Das versuche ich zu verhindern. – Shawn31313

+0

@ Shawn31313 Sie möchten also, dass es einem Benutzer unmöglich ist, * jemandem * freiwillig zu erlauben, sich als jemand auszugeben? Das ist einfach nicht möglich - ich kann immer mein E-Mail-Passwort oder meine Authentifizierungs-Cookies weitergeben, wenn ich freiwillig meine Fähigkeit verleihen möchte, meine Identität gegenüber jemand anderem zu beweisen. – apsillers

+0

@ Shawn31313 Oder möchten Sie nur verhindern, dass Benutzer den Link versehentlich verraten? Wenn dies der Fall ist, verwenden Sie einfach Cookies oder senden Sie Zugangsdaten innerhalb des Socket-Kanals, um diese Informationen zu übermitteln. – apsillers