Ist es beim Entwerfen der REST-API üblich, zuerst einen Benutzer zu authentifizieren?
Der typische Anwendungsfall, den ich suche, ist:
- Benutzer möchte Daten erhalten. Klar cool teilen wir gerne! Holen Sie sich einen öffentlichen API-Schlüssel und lesen Sie ihn weg!
- Benutzer möchte Daten speichern / aktualisieren ... woah warte! Wer bist du, kannst du das tun?
Ich möchte es einmal erstellen und beispielsweise einer Web-App, einer Android-Anwendung oder einer iPhone-Anwendung erlauben, es zu verwenden.
Eine REST-API scheint bei solchen Anforderungen eine logische Wahl zu sein
Um meine Frage zu veranschaulichen, verwende ich ein einfaches Beispiel.
Ich habe ein Element in einer Datenbank, das ein Bewertungsattribut (Ganzzahl 1 bis 5) hat.
Wenn ich REST richtig verstehe, würde ich eine GET-Anfrage in der Sprache meiner Wahl implementieren, die csv, xml oder json wie folgt zurückgibt:
http://example.com/product/getrating/{id}/
Angenommen, wir wählen JSON aus und kehren zurück:
{
"id": "1",
"name": "widget1",
"attributes": { "rating": {"type":"int", "value":4} }
}
Dies ist in Ordnung für öffentlich zugängliche APIs. Ich verstehe diesen Teil.
Ich habe unzählige Fragen, wie ich dies mit einem Sicherheitsmodell kombinieren kann. Ich bin an die Sicherheit von Web-Apps gewöhnt, bei denen ich einen Sitzungsstatus habe, der meinen Benutzer jederzeit identifiziert, damit ich steuern kann, was er tun kann, unabhängig davon, was er mir sendet. Soweit ich weiß, ist dies nicht RESTful, daher wäre dies in diesem Fall eine schlechte Lösung.
Ich werde versuchen, ein anderes Beispiel mit demselben Artikel / derselben Bewertung zu verwenden.
Wenn Benutzer "JOE" einem Artikel eine Bewertung hinzufügen möchte
Dies könnte geschehen mit:
http://example.com/product/addrating/{id}/{givenRating}/
An dieser Stelle möchte ich die Daten speichern, die besagen, dass "JOE" dem Produkt {id} eine Bewertung von {GivenRating} gegeben hat.
Frage: Woher weiß ich, dass die Anfrage von "JOE" und nicht von "BOB" kam?
Was wäre, wenn es sich um sinnvollere Daten wie die Telefonnummer eines Benutzers handeln würde?
Was ich bisher habe ist:
1) Verwenden Sie die integrierte Funktion von HTTP, um sich bei jeder Anforderung zu authentifizieren, entweder bei einfachem HTTP oder bei HTTPS.
Dies bedeutet, dass jede Anfrage jetzt die Form hat:
https://joe:joepassword@example.com/product/addrating/{id}/{givenRating}/
2) Verwenden Sie einen Ansatz wie Amazon S3 mit privatem und öffentlichem Schlüssel: http://www.thebuzzmedia.com/designing-a-secure-rest-api-without-oauth-authentication/
3) Verwenden Sie trotzdem ein Cookie und brechen Sie den zustandslosen Teil von REST.
Der zweite Ansatz erscheint mir besser, aber ich frage mich, ob ich das Ganze wirklich neu erfinden muss. Hashing, Speichern, Generieren der Schlüssel usw. ganz alleine?
Das klingt sehr nach der Verwendung einer Sitzung in einer typischen Webanwendung und dem Umschreiben des gesamten Stapels selbst, was für mich normalerweise bedeutet, dass Sie es falsch machen, insbesondere wenn es um Sicherheit geht.
EDIT: Ich denke, ich hätte auch OAuth erwähnen sollen.