Token basierte Authentifizierung des Nutzers

  • Hey,


    ich probiere mich zur Zeit mit der Token basierten Authentifizierung eines Nutzers bei einem Login aus. Dabei bin ich auf JSON Web Token (JWT) gestoßen.


    Dafür nutze ich die Bibliothek ReallySimpleJWT.


    Wichtig: Ich habe jetzt einfach mal zügig ein Login erstellt, welches nur zur Realisierung der Token basierten Authentifizierung dient und manche Sicherheitsaspekte nicht beachtet !


    Ich dachte mir dabei, wie bei Cookies, einfach den Token zu erstellen. Dann wird der Token wohl automatisch lokal auf dem PC des Nutzers abgespeichert. Mit der Funktion getToken kann ich dann auf anderen Seiten auf diesen zugreifen. Da habe ich mich aber geirrt und weiß da gerade nicht weiter, wie ich auf den Token von anderen Seiten aus zugreifen kann.

    So sieht der PHP-Code in der Login-Seite aus:

    Auf der start.php möchte ich dann auf den abgespeicherten Token des Nutzers zugreifen. Leider finde ich da bisher keine Möglichkeit, da ohne diesen kaum eine Funktion aufgeruft werden kann.


    Hat jemand von euch damit Erfahrungen und weiß, wie ich dies lösen kann? Darüber wäre ich sehr dankbar.


    Schöne Grüße,
    Stef

  • Die Library generiert nur Token (und holt die Daten wieder raus), das Abspeichern und das anschliessende Lesen musst du selbst machen. Z.b. in der Session. Dann brauchst du aber auch kein JWT, in die Session kannst du auch eine Benutzer-ID und andere Informationen speichern.


    JWT benutze ich z.b. wenn Frontend/Backend getrennt ist. Nach einem Login schickt der Server den JWT zurück an mein (z.b. Angular)Applikation in welcher ich den JWT im Browser abspeichere, z.b. in der LocalStorage und dann mit jedem Request an den Server schicken, der mich dann so authentifiziert.

  • Hey Jonas,


    danke dir für deine Antwort :-)


    So wie ich es gerade verstanden habe bringen JWT nur etwas, wenn die Applikation clientseitig läuft? Denn dort besteht ja die Möglichkeit ohne Cookie oder Session so etwas lokal abzuspeichern. Serverseitig dagegen habe ich nur die Session oder den Cookie. Wenn ich es mit diesen mache ist es dann eine Session basierte Authentifizierung, die ich aber nicht implementieren möchte.


    Liege ich da soweit richtig?


    Schöne Grüße,
    Stef

  • So in die Richung ja, auch wenn ein Cookie natürlich auch auf dem Client gespeichert wird.


    Stateless Session nennt man das. Wenn du Seiten per PHP renderst und dort eine Loginprüfung hast machen JWT keinen Sinn.


    Weshalb willst du denn keine Session basierte Authentifizierung, wenn ich fragen darf?

  • Guten Morgen :-)


    okay. Danke dir :-)

    Einfach zum Lernen wie ich diese entwickeln kann. Diese bietet wie ich gelesen habe auch Vorteile, wenn es ziemlich viele Nutzer gibt, die diesen Prozess nutzen. Denn dann werden die ganzen Daten serverseitig gespeichert und irgendwann ist der Server von den ganzen Daten überfüllt und überlastet.


    Da kommt dann die Token basierte Authentifizierung ins Spiel, mit der ich dies verhindern kann. Denn dort werden die Logindaten lokal abgespeichert.


    Schöne Grüße,
    Stef

  • JTW ist sehr schönes Thema.

    Aber man muss es verstehen.


    Erstmal Link, zu dem Repo, welches ich empfehlen würde (und was auch wirklich "simple" ist =))

    https://github.com/firebase/php-jwt/


    Und Website https://jwt.io/, bei der Ich damals angefangen habe (Click auf "Learn more about JWT").


    In kurz und einfach (versucht) :

    - Json Web Token (JWT) werden vom Server z.B. nach erfolgreichem Login erstellt.

    - JWT sind (vom LoginServer) signiert (wenn man die Payload ändert, dann passt die Signatur nicht mehr).

    - der Server alleine kann die JWT signieren (mit private key).

    - jeder, der den JWT nun bekommt, kann sicher sein, dass die Daten darin nicht verändert wurden (weil signiert).

    - Die Signatur wird per public key geprüft.

    - Ein JWT sollte eine Verfallszeit haben.

    - Der Empfänger eines JWT muss diesen validieren (Signatur, noch valide, schon valide (ja, geht auch), ect).

    - Wer den JWT hat, hat die Berechtigung, bis dieser Abläuft.


    Wichtig: ein JWT sollte niemals sensible Daten beinhalten.

    Man liest ab und zu von verschlüsselten Daten im JWT, aber das ist mMn Mist. Da gehört nichts sensibles rein.


    Wo nutze ich JWT: Mirco Services z.B.

    Ein Auth login server, und viele unabhängige Services.

    Der User meldet sich an (Login Website mit call auf Auth Server) und bekommt einen JWT.

    Mit dem Token kann er nun zu jedem Micro Service. Und die wissen, dass er User das darf, was da drin steht (roles, groups, ...).


    ---

    Spannendes Thema, eigtl. gar nicht so schwierig, aber leider zu viel, um es hier alles runter zu schreiben.

    Daher hier einfach mal paar Links zu Kommentaren, die ich schon mal geschrieben habe (warum auch noch mal schreiben :D )


    JWT Client Bsp (und Erklärung, warum man die Daten darin nicht wiederverwenden sollte)

    https://github.com/firebase/ph…83#issuecomment-447845729


    Client-Server Bsp (und mehr).

    https://github.com/firebase/ph…19#issuecomment-525464922


    Mehrere JWT pro Benutzer?
    https://github.com/firebase/ph…31#issuecomment-433397553



    Viel Spass (das Thema macht auch Spass =) )

  • Hey,

    Das ist natürlich ein sehr, sehr theoretisches Problem. ;)

    Ich kenne mich da zu wenig aus um dies beurteilen zu können. Ich denke, wenn mehrere tausend, bzw. zehntausend Personen gleichzeitig online sind, soetwas dann doch ein Vorteil bietet.


    Vielen Dank für deine umfangreiche Antwort cottton :-) Diese hilft mir sehr weiter. Ich brauche jetzt erstmal ein wenig Zeit um mir das Ganze anzuschauen. Ich melde mich sobald ich weiter bin oder Fragen aufkommen, bei denen ich nicht weiterkomme.


    Schöne Grüße,

    Stef