Ich erstelle eine REST-API, die den Vorschlägen von Apigee genau folgt, Substantive verwendet, keine Verben, in die URL eingebrannte API-Version, zwei API-Pfade pro Sammlung, Verwendung von GET POST PUT DELETE usw.
Ich arbeite am Anmeldesystem, bin mir aber nicht sicher, wie REST-Benutzer ordnungsgemäß angemeldet werden sollen. Ich arbeite derzeit nicht an der Sicherheit, sondern nur am Anmeldemuster oder -ablauf. (Später werden wir 2 Schritte oAuth mit einem HMAC usw. hinzufügen.)
Möglichkeiten
- Ein Beitrag zu so etwas
https://api...com/v1/login.json
- Ein Put zu so etwas
https://api...com/v1/users.json
- Etwas, an das ich noch nicht gedacht habe ...
Was ist der richtige REST-Stil für die Anmeldung von Benutzern?
api
rest
design-patterns
Scott Roepnack
quelle
quelle
Accept
HTTP-Header berücksichtigen .Accept
Header verwenden, haben Sie auch einenVary: Accept
, sodass das Caching nicht beeinträchtigt wird. Conneg in Erweiterung wurde bereits zuvor besprochen . Ich würde Shonzillas Antwort dort allerdings zustimmen.Antworten:
Das prinzipielle Design der modernen Webarchitektur von Roy T. Fielding und Richard N. Taylor , dh die Abfolge von Arbeiten aus allen REST-Begriffen, enthält die Definition der Client-Server-Interaktion:
Diese Einschränkung erfüllt vier Funktionen: 1. und 3. sind in diesem speziellen Fall wichtig:
Und jetzt kehren wir zu Ihrem Sicherheitsfall zurück. Jede einzelne Anfrage sollte alle erforderlichen Informationen enthalten, und Autorisierung / Authentifizierung ist keine Ausnahme. Wie erreicht man das? Senden Sie bei jeder Anfrage buchstäblich alle erforderlichen Informationen über Kabel.
Eines der Beispiele, wie dies archiviert werden kann, ist der Hash-basierte Nachrichtenauthentifizierungscode oder HMAC . In der Praxis bedeutet dies, jeder Anforderung einen Hash-Code der aktuellen Nachricht hinzuzufügen. Hash-Code, berechnet durch kryptografische Hash-Funktion in Kombination mit einem geheimen kryptografischen Schlüssel . Die kryptografische Hash-Funktion ist entweder vordefiniert oder Teil der Code-on-Demand- REST-Konzeption (z. B. JavaScript). Der Server sollte dem Client einen geheimen kryptografischen Schlüssel als Ressource zur Verfügung stellen, der vom Client zur Berechnung des Hash-Codes für jede Anforderung verwendet wird.
Es gibt viele Beispiele für HMAC- Implementierungen, aber ich möchte, dass Sie die folgenden drei beachten:
Wie es in der Praxis funktioniert
Wenn der Client den geheimen Schlüssel kennt, kann er mit Ressourcen arbeiten. Andernfalls wird er vorübergehend umgeleitet (Statuscode 307 Temporäre Umleitung), um einen geheimen Schlüssel zu autorisieren und abzurufen, und dann zurück zur ursprünglichen Ressource umgeleitet. In diesem Fall müssen Sie nicht vorher wissen (dh irgendwo fest codieren), wie die URL lautet , um den Client zu autorisieren , und es ist möglich, dieses Schema mit der Zeit anzupassen.
Ich hoffe, dies hilft Ihnen, die richtige Lösung zu finden!
quelle
TL; DR Die Anmeldung für jede Anforderung ist keine erforderliche Komponente, um die API-Sicherheit zu implementieren. Die Authentifizierung ist.
Es ist schwierig, Ihre Frage zum Login zu beantworten, ohne allgemein über Sicherheit zu sprechen. Bei einigen Authentifizierungsschemata gibt es keine herkömmliche Anmeldung.
REST schreibt keine Sicherheitsregeln vor, aber die in der Praxis am häufigsten verwendete Implementierung ist OAuth mit 3-Wege-Authentifizierung (wie Sie in Ihrer Frage erwähnt haben). Es gibt keine Anmeldung an sich, zumindest nicht bei jeder API-Anforderung. Bei der 3-Wege-Authentifizierung verwenden Sie nur Token.
Dieses Schema gibt dem Benutzer die Möglichkeit, den Zugriff jederzeit zu widerrufen. Praktisch alle öffentlich verfügbaren RESTful-APIs, die ich gesehen habe, verwenden OAuth, um dies zu implementieren.
Ich denke nur nicht, dass Sie Ihr Problem (und Ihre Frage) in Bezug auf die Anmeldung einrahmen sollten, sondern darüber nachdenken sollten, die API im Allgemeinen zu sichern.
Weitere Informationen zur Authentifizierung von REST-APIs im Allgemeinen finden Sie in den folgenden Ressourcen:
quelle
Ein großer Teil der REST-Philosophie besteht darin, beim Entwurf Ihrer API so viele Standardfunktionen des HTTP-Protokolls wie möglich zu nutzen. Wenn Sie diese Philosophie auf Authentifizierung, Client und Server anwenden, werden Standard-HTTP-Authentifizierungsfunktionen in der API verwendet.
Anmeldebildschirme eignen sich hervorragend für Anwendungsfälle menschlicher Benutzer: Besuchen Sie einen Anmeldebildschirm, geben Sie Benutzer / Kennwort ein, setzen Sie ein Cookie, der Client stellt dieses Cookie in allen zukünftigen Anforderungen bereit. Von Menschen, die Webbrowser verwenden, kann nicht erwartet werden, dass sie bei jeder einzelnen HTTP-Anforderung eine Benutzer-ID und ein Kennwort angeben.
Für eine REST-API sind ein Anmeldebildschirm und Sitzungscookies jedoch nicht unbedingt erforderlich, da jede Anforderung Anmeldeinformationen enthalten kann, ohne einen menschlichen Benutzer zu beeinträchtigen. und wenn der Kunde zu irgendeinem Zeitpunkt nicht kooperiert, kann eine
401
"nicht autorisierte" Antwort gegeben werden. RFC 2617 beschreibt die Authentifizierungsunterstützung in HTTP.TLS (HTTPS) wäre ebenfalls eine Option und würde die Authentifizierung des Clients gegenüber dem Server (und umgekehrt) bei jeder Anforderung ermöglichen, indem der öffentliche Schlüssel der anderen Partei überprüft wird. Zusätzlich sichert dies den Kanal für einen Bonus. Dazu ist natürlich vor der Kommunikation ein Schlüsselpaaraustausch erforderlich. (Beachten Sie, dass es speziell darum geht, den Benutzer mit TLS zu identifizieren / zu authentifizieren. Das Sichern des Kanals mithilfe von TLS / Diffie-Hellman ist immer eine gute Idee, auch wenn Sie den Benutzer nicht anhand seines öffentlichen Schlüssels identifizieren.)
Ein Beispiel: Angenommen, ein OAuth-Token sind Ihre vollständigen Anmeldeinformationen. Sobald der Client über das OAuth-Token verfügt, kann es bei jeder Anforderung als Benutzer-ID in der Standard-HTTP-Authentifizierung angegeben werden. Der Server kann das Token bei der ersten Verwendung überprüfen und das Ergebnis der Überprüfung mit einer Lebensdauer zwischenspeichern, die bei jeder Anforderung erneuert wird. Jede Anforderung, die eine Authentifizierung erfordert, wird zurückgegeben,
401
wenn sie nicht angegeben wird.quelle