2015-11-11 9 views
5

Ich lerne über Token-basierte Authentifizierung mit JSON Web Token und hier ist, wie ich es jetzt für eine mobile App, mit z. Swift:Token-basierte Authentifizierung von einer mobilen App

  1. ich ein Objekt in der App-Eingang mit Benutzer erstellen kann, wie

    { Benutzername: "PatrickBateman", Kennwort: "ismyknifesharp", Rolle: "regular", . .. }

  2. Dann kann ich ein JWT-Token von ihm mit einem library generieren.

  3. Dann sende ich es an einen unterstützten API-Endpunkt, wie /api/contacts/list. Oder muss ich Login/Passwort senden, um sich zu authentifizieren?
  4. Server überprüft irgendwie die Token-Korrektheit. Aber wie? Sollte dieses servergenerierte Token in der Datenbank gespeichert und als Schlüssel verwendet werden? Oder muss ich das Token auf dem Server jedes Mal generieren, wenn ich eine Anfrage vom Client bekomme und diese mit dem Client-Token vergleiche?
  5. Holen und verwalten Sie alle Daten, die ich brauche.

Hier sind meine Schlussfolgerungen:

  1. Ich brauche nicht Login/Passwort-Paar an den Server zu senden, um den Benutzer zu authentifizieren.
  2. Ich muss jedes Mal Token senden, wenn ich Auth-only Daten bekommen muss.
  3. Ich sollte einen Algorithmus implementieren, der das generierte Token aufgrund einiger Faktoren, wie Zeitüberschreitung, ändert, damit Token ablauffähig werden.
  4. Ich sollte das Token innerhalb der Header senden, aber nicht unbedingt, wie es im Körper der JSON-Anfragen getan werden kann.

Sind diese Schlussfolgerungen richtig? Wie überprüfe ich das Token, das der Client sendet?

Antwort

1

Meine Meinung:

  1. Wir sollten nicht Passwort des Benutzers auf dem Client halten. Der Client sollte beim Anmelden/Anmelden ein Kennwort an den Server senden und nicht irgendwo im Client speichern. Die Anfrage sollte https lauten und das Passwort sollte nicht verschlüsselt sein. Wir werden das Passwort später auf der Serverseite verschlüsseln.

  2. Der Server generiert nach erfolgreicher Benutzeranmeldung einen token für diesen Benutzer. Die token enthält das abgelaufene Datum in sich. Wir werden das Token verwenden, um die Berechtigung mit dem Server zu authentifizieren.

  3. Ich denke, jede Anfrage an API sollte das Token zur Verfügung stellen, außer die Anmeldung/Anmeldung/Passwort vergessen Anfragen.

  4. Token sollte in die Kopfzeile der Anfrage eingefügt werden.

  5. Server sollen Clientanforderung ein neues Token mit dem alten Token ermöglichen (vielleicht abgelaufen sein)

Und die Antwort auf "Wie Server das Token vom Client überprüfen?". Es gibt viele Möglichkeiten, dies zu tun. Der folgende Weg ist mein derzeitiger Ansatz:

Server Seite generieren ein Token, das ist eine verschlüsselte Zeichenfolge von (wie Token abgelaufene Zeit, Benutzer-ID, Rolle ... des Benutzers) und ein Passwort (nur auf dem Server) Seite) mit HMAC- oder RSA-Algorithmen. Wenn Benutzer eine token senden, kann der Server die user info, abgelaufene Zeit entschlüsseln und abrufen, ohne von der Datenbank abzufragen.

Wie auch immer, diese Frage bezieht sich nicht auf Swift Tag.

+0

Warum ist es keine gute Idee, das Passwort und den Benutzernamen auf der Client-Seite zu behalten? In iOS können wir sie in Keychain sicher speichern, oder? – user805981

+0

Auch wenn wir sie sicher aufbewahren können, aber das hat keinen Vorteil. Wir sollten das gespeicherte Passwort nicht zur erneuten Anmeldung verwenden. Der gute Weg ist, mit dem Token zu arbeiten oder zu verlangen, dass der Benutzer sein Passwort erneut über das Login-Formular eingibt. – t4nhpt

+0

Ich verstehe. Und wenn wir JWT- und Refresh-Token verwenden würden. Sollten wir feststellen, ob der JWT auf der Client-Seite abgelaufen ist, bevor irgendwelche HTTP-Anfragen gesendet werden? Oder sollten wir den JWT ablaufen lassen und dem Client eine 400 zurückgeben, bevor wir in einen Aktualisierungszyklus eintreten? – user805981