2017-01-29 1 views
0

Lassen Sie uns diesen Anwendungsfall betrachten:API-Design - Ist es in Ordnung, Benutzerdaten vom Authentifizierungs-Token abzurufen?

1) Ich meine API Login Endpunkt mit Benutzername und Passwort nennen und meine Auth-Token bekommen, dass ich zu jedem aufeinander folgenden Anforderung an den Header als Authorization: Bearer <token> hinzufügen.

2) Ich rufe /current-user Endpunkt mit keine Parameter, nur mit Authorization-Header. Der Server autorisiert den Benutzer mit dem Token und erhält die Benutzer-ID von diesem Token. Dann findet er den Benutzer nach ID in der Datenbank und gibt seine Daten zurück.

Meine Frage ist, ob dieser Ansatz nicht unsicher ist. Ich frage mich, was wäre, wenn ich ein Angreifer wäre und /current-user Endpunkt mit zufällig generierten Tokens aufrufen würde. Sobald ich gelegentlich echte Token übereinstimmte, würde der Server mir die Daten anderer Benutzer zurückgeben.

Ist es nicht notwendig, die Benutzer-ID auf dem Client zusammen mit den Token- und Anrufanforderungen zu speichern? Z.B. /user?id=<stored user id> mit Autorisierung Header und loswerden /current-user Endpunkt? Danach würde eine Art ACL auf dem Server feststellen, ob das verwendete Token den Zugriff auf den Benutzer mit der übergebenen Benutzer-ID erlaubt hat.

(Ich fand es gibt auch Token JWT, aber ich sehe das gleiche Problem. Als Angreifer würde ich irgendwie andere Benutzer-Token und Server mir würde zurückkehren, um seine Daten zu erraten verwalten)

Antwort

1

Aus Sicherheitsgründen ist es normalerweise angenommen, dass die Benutzerkennung dem Angreifer ohnehin bekannt ist. Wenn der Angreifer beispielsweise bereits ein rechtmäßiges Konto besitzt oder kennt, kann er möglicherweise erraten, wie andere Benutzer-IDs zugewiesen werden.

Auch, wenn Ihr Token lang genug und völlig zufällig ist, macht es keinen Unterschied.

Sehen Sie es sich so an: Nehmen wir an, Ihr Token hat die Länge n, Ihre Benutzerkennung hat die Länge m. Ohne die Benutzer-ID muss der Angreifer n Zeichen erraten, und dabei muss er n+m Zeichen erraten. Wenn Ihre n hoch genug ist, benötigen Sie diese zusätzlichen Zeichen nicht. Denken Sie daran, dass die effektive Länge der Benutzer-ID möglicherweise viel kürzer ist als ihre scheinbare Länge, wenn Ihre Benutzer-IDs nicht völlig zufällig sind, so dass die m hinzugefügt tatsächlich wirklich klein sein könnte.

+0

Hm hm ich verstehe. Also mache ich das Token im Grunde lange genug. BTW: Es wird nicht "n + m" sein, sondern mehr, weil er die Kombination erraten muss, die ich denke (?) – simPod

1

Ist es möglich, dass Sie digital signierte Tokens verwenden? Sie können das Token grundsätzlich mit dem privaten Schlüssel des Clients (oder Benutzers) verschlüsseln und dann das Paket zusammen mit der Klartext-Benutzer-ID erneut mit dem öffentlichen Schlüssel des Servers verschlüsseln. Auf diese Weise kann nur der Server das Paket entschlüsseln und sobald es entschlüsselt ist, weiß es, wer der Benutzer ist. Er kann dann den öffentlichen Schlüssel verwenden, der dieser Benutzer-ID zugeordnet ist, um das Paket zu entschlüsseln und das Token zu erhalten.

Da Sie nicht viele Informationen über die Anwendung und die erforderliche Geschwindigkeit der Authentifizierung oder Technologien zur Verfügung gestellt haben, ist es schwierig, weitere Informationen bereitzustellen.

+0

Danke für die Antwort! Ich habe auch über solche Token nachgedacht, aber ich habe es verschoben, weil ich mich vorerst nicht um seine Umsetzung kümmern will. Meine Frage konzentriert sich mehr auf diesen API-Entwurf, egal ob dieser Ansatz in Ordnung ist oder nicht und unter welchen Bedingungen. – simPod

Verwandte Themen