webentwicklung-frage-antwort-db.com.de

Best Practices für die Authentifizierung und Autorisierung in Angular ohne RESTful-Prinzipien zu brechen?

Ich habe einige SO) Threads über Authentifizierung und Autorisierung mit REST und Angular gelesen, aber ich habe immer noch nicht das Gefühl, dass ich eine großartige Lösung für habe Was ich mir erhoffe Für einige Hintergrundinformationen plane ich, eine App in AngularJS zu erstellen, die ich unterstützen möchte:

  1. Eingeschränkter Gastzugang
  2. Rollenbasierter Zugriff auf die Anwendung nach der Authentifizierung
  3. Authentifizierung über APIs

Alle Aufrufe der REST API müssen über SSL erfolgen. Ich möchte die App erstellen, ohne die RESTful-Prinzipien zu verletzen, dh den Sitzungsstatus nicht auf dem Server zu speichern Natürlich muss das, was auf der Client-Seite für die Autorisierung getan wird, auf der Server-Seite verstärkt werden. Da wir bei jeder Anforderung den gesamten Status übergeben müssen, weiß ich, dass ich eine Art Token übergeben muss, damit die Der Back-End-Server, der die REST Anfrage empfängt, kann den Anruf sowohl authentifizieren als auch autorisieren.

Vor diesem Hintergrund dreht sich meine Hauptfrage um die Authentifizierung - was sind die besten Vorgehensweisen hier? Es scheint, dass viele verschiedene Ansätze diskutiert werden. Hier sind nur einige, die ich gefunden habe:

Es wurde eine ähnliche Frage gestellt ( AngularJS Best Practice-Anwendungsauthentifizierung ), aber wenn ich die Antwort nicht falsch verstehe, sollte anscheinend eine Serversitzung verwendet werden, die gegen die RESTful-Prinzipien verstößt.

Mein Hauptanliegen bei Amazon AWS und dem Artikel von George Reese ist die Annahme, dass der Verbraucher eher ein Programm als ein Endbenutzer ist. Ein gemeinsames Geheimnis kann im Voraus an einen Programmierer ausgegeben werden, der es dann verwenden kann, um hier Anrufe zu verschlüsseln. Dies ist hier nicht der Fall - ich muss die REST API von der App im Namen des Benutzers aufrufen.

Wäre dieser Ansatz ausreichend? Angenommen, ich habe eine Sitzungsressource:

POST/api/session

Erstellen Sie eine neue Sitzung für einen Benutzer

Um eine Sitzung zu erstellen, müssen Sie POST ein JSON-Objekt mit dem "Benutzernamen" und "Passwort".

{
    "email" : "[email protected]",
    "password" : "password"
}

Curl-Beispiel

curl -v -X POST --data '{"username":"[email protected]","password":"password"}' "https://app.example.com/api/session" --header "Content-Type:application/json"

Antwort

HTTP/1.1 201 Created {
    "session": {
        "id":"520138ccfa4634be08000000",
        "expires":"2014-03-20T17:56:28+0000"
    }
}

Statuscodes

  • 201 - Erstellt, neue Sitzung eingerichtet
  • 400 - Ungültige Anforderung, das JSON-Objekt ist ungültig oder erforderliche Informationen fehlen
  • 401 - Nicht autorisiert, E-Mail/Passwort-Kombination prüfen
  • 403 - Zugriff verweigert, deaktiviertes Konto oder Lizenz ungültig

Ich lasse die HATEOAS-Details aus Gründen der Klarheit weg. Auf dem Backend wird ein neuer Sitzungsschlüssel mit begrenzter Dauer erstellt und dem Benutzer zugeordnet. Bei nachfolgenden Anfragen könnte ich dies als Teil der HTTP-Header übergeben:

Authorization: MyScheme 520138ccfa4634be08000000 

Dann wären die Back-End-Server dafür verantwortlich, dies aus der Anforderung herauszulösen, den zugeordneten Benutzer zu finden und Berechtigungsregeln für die Anforderung durchzusetzen. Es sollte wahrscheinlich auch den Ablauf der Sitzung aktualisieren.

Wenn dies alles über SSL geschieht, lasse ich die Tür für jegliche Art von Angriffen offen, vor denen ich mich schützen sollte? Sie könnten versuchen, Sitzungsschlüssel zu erraten und sie in die Kopfzeile einzufügen, also könnte ich vermutlich zusätzlich einen Benutzer GUID an den Sitzungsschlüssel anhängen, um Brute-Force-Angriffe weiter zu verhindern.

Es ist ein paar Jahre her, seit ich aktiv programmiert habe und ich komme gerade wieder auf die Schaukel. Entschuldigung, wenn ich stumpf bin oder das Rad unnötig neu erfinde, in der Hoffnung, meine Ideen von der Community hier basierend auf meiner bisherigen Lektüre umzusetzen und zu sehen, ob sie den Lackmustest bestehen.

41
austrum

Wenn jemand nach der REST Authentifizierung fragt, schlage ich die Amazon Web Services vor und schlage im Grunde "mach das" vor Das Problem wird von Menschen, die weit mehr als die meisten wissen und sich darum kümmern, was eine sichere Anfrage ausmacht, intensiv genutzt, intensiv analysiert und überprüft, und Sicherheit ist ein guter Ort, um das Rad nicht neu zu erfinden stehen auf ", können Sie schlechter als AWS tun.

Jetzt verwendet AWS keine Token-Technik, sondern einen sicheren Hash, der auf gemeinsam genutzten Geheimnissen und der Nutzlast basiert. Es ist wohl eine kompliziertere Implementierung (mit all ihren Normalisierungsprozessen usw.).

Aber es funktioniert.

Der Nachteil ist, dass Ihre Anwendung das gemeinsame Geheimnis der Person (d. H. Das Passwort) aufbewahren muss und der Server Zugriff auf eine Klartextversion des Passworts haben muss. Dies bedeutet normalerweise, dass das Kennwort verschlüsselt gespeichert und anschließend entsprechend entschlüsselt wird. Dies führt zu einer noch komplexeren Verwaltung von Schlüsseln und anderen Dingen auf der Serverseite im Vergleich zu einer sicheren Hashing-Technik.

Das größte Problem bei jeder Token-Passing-Technik sind natürlich Man-in-the-Middle-Angriffe und Replay-Angriffe. SSL mildert dies natürlich größtenteils.

Natürlich sollten Sie auch die OAuth) -Familie berücksichtigen, die ihre eigenen Probleme hat, insbesondere mit der Interoperabilität, aber wenn dies kein primäres Ziel ist, dann sind die Techniken mit Sicherheit gültig.

Für Ihre Anwendung ist der Token Lease keine große Sache. Ihre Anwendung muss noch innerhalb des Zeitrahmens des Leasingvertrags ausgeführt werden oder sie muss erneuert werden können. Zu diesem Zweck müssen die Anmeldeinformationen des Benutzers beibehalten oder erneut abgefragt werden. Behandle das Token einfach wie alles andere als erstklassige Ressource. Wenn es sinnvoll ist, versuchen Sie, andere Informationen mit der Anforderung zu verknüpfen und sie in das Token (Browsersignatur, IP-Adresse) zu bündeln, um eine bestimmte Lokalität zu erzwingen.

Sie sind immer noch offen für (potenzielle) Wiederholungsprobleme, bei denen dieselbe Anfrage zweimal gesendet werden kann. Bei einer typischen Hash-Implementierung ist ein Zeitstempel Teil der Signatur, der die Lebensdauer der Anforderung einschränken kann. Das ist in diesem Fall anders gelöst. Zum Beispiel kann jede Anfrage mit einer Seriennummer oder einer GUID) gesendet werden, und Sie können aufzeichnen, dass die Anfrage bereits abgespielt wurde, um ein erneutes Auftreten zu verhindern.

15
Will Hartung

Hier ist ein unglaublicher Artikel über Authentifizierungs- und Anmeldedienste, die mit Angular erstellt wurden.

https://medium.com/opinionated-angularjs/7bbf0346acec

9
Sten Muchow

Mit dieser SO Frage kann ich mein Verständnis von REST gut zusammenfassen

Verletzen Sitzungen wirklich die RESTfulness?

Wenn Sie ein Token in einer Sitzung speichern, die Sie noch auf der Serverseite erstellen (dies ist ein Problem, da diese Sitzung in der Regel nur auf dem einen Server gespeichert ist. Dies kann durch dauerhafte Sitzungen oder andere Lösungen verringert werden).

Ich würde gerne wissen, was Ihre Argumentation für die Schaffung eines RESTful-Service ist, da dies vielleicht kein wirklich großes Problem darstellt.

Wenn Sie zusammen mit jeder Anforderung ein Token im Hauptteil senden (da alles mit SSL verschlüsselt ist, ist dies in Ordnung), können Sie eine beliebige Anzahl von Servern (mit Lastenausgleich) die Anforderung ohne vorherige Kenntnis des Status bedienen.

Ich halte es für ein gutes Ziel, REST-konforme Implementierungen anzustreben, aber rein statusfrei zu sein, schafft mit Sicherheit eine zusätzliche Komplexität, wenn es um die Authentifizierung und Überprüfung von Berechtigungen geht.

Bisher habe ich angefangen, meine Back-Ends mit dem Gedanken zu erstellen, dass REST) URIs sinnvoll sind und die richtigen HTTP-Verben verwendet werden, aber dennoch ein Token in einer Sitzung verwendet wird, um die Authentifizierung zu vereinfachen (wenn nicht mehrere Server verwendet werden).

Ich habe die Links durchgelesen, die du gepostet hast. Der AngularJS scheint sich nur auf den Client zu konzentrieren und den Server in diesem Artikel nicht explizit anzusprechen. Er verlinkt auf einen anderen (Ich bin kein Node Benutzer verzeihen mir, wenn meine Interpretation hier falsch ist), aber es scheint, dass der Server sich darauf verlässt, dass der Client ihm mitteilt, welche Berechtigungsstufe er hat, was eindeutig keine gute Idee ist.

0
shaunhusain