Entwerfen einer API mit Zugriffstoken, Wie werden GET-Anforderungen behandelt?

8

Ich erstelle eine API, die Zugriffstoken verwendet, damit ich die Nutzung zwischen verschiedenen Abteilungen und für die Zugriffskontrolle verfolgen kann. Mein Plan ist es, die HTTP-Verben angemessen zu verwenden - GETInformationen abzurufen, POSThinzuzufügen, zu DELETElöschen usw.

Meine Frage ist, wie ich mit Zugriffstoken bei den GET-Aufrufen umgehen soll.

Option eins:

Soll das Zugriffstoken als Teil der Abfragezeichenfolge bereitstellen : /api/users/?token=ACCESSTOKEN. Das Problem dabei ist, dass ACCESSTOKEN in Serverprotokollen angezeigt wird. Diese Methode unterscheidet sich auch von POST- oder DELETE-Anforderungen, bei denen das Token über den Body übergeben wird.

Option zwei:

Geben Sie einen Text für die Anforderung an (wie in einer POSTAnforderung), und einer der Parameter ist das Token. Mein Problem hierbei ist, dass andere Entwickler in meinem Unternehmen mir mitteilen, dass dies keine "echte GET-Anfrage" ist, da ich Daten weitergebe. Die URL, die sie nennen, sieht einfach so aus /api/users/und wird token=ACCESSTOKENim Körper bereitgestellt.

Option drei:

Lass es fallen GETund zwinge alles dazu, a zu sein POST. Diese Idee gefällt mir nicht, da ich für viele dieser API-Aufrufe keine neuen Ressourcen erstelle. Ich gebe einfach Daten zurück, die sich zufällig hinter einer API befinden, für die eine Autorisierung erforderlich ist.

Gibt es eine Option, die mir fehlt oder die ich verfeinern sollte? Ich mag Option 2, bin aber sensibel für die Bedenken anderer Abteilungsentwickler.

Neuer Typ
quelle
Vergessen Sie nicht Ihre Anforderungsheader wie Authorization.
Joshua Dutton

Antworten:

7

Option 4: Autorisierungsheader und RFC 6750 (Bearer Tokens)

Die Lösung, nach der Sie suchen, wurde bereits als Teil des OAuth2-Standards angegeben, steht jedoch für sich und ist in Ihrem Szenario hilfreich.

https://tools.ietf.org/html/rfc6750

Alle Anforderungen vom Client werden in einem Inhaber-Token (Ihrem Zugriffstoken) übergeben, und es sieht aus wie jeder andere Anforderungsheader an den Server. Die Anfrage selbst sieht folgendermaßen aus:

GET /resource HTTP/1.1
Host: server.example.com
Authorization: Bearer mF_9.B5f-4.1JqM

Da es sich um einen weit verbreiteten öffentlichen Standard handelt, müssen Sie sich keine Gedanken über die Definition des Verhaltens machen. Zeigen Sie einfach clientseitige Entwickler auf den RFC. Sie könnten auch in Betracht ziehen, den Rest des OAuth2-Standards sowohl als Ressourcenserver als auch als Autorisierungsserver zu implementieren , aber das ist viel mehr Arbeit.

Jack Scott
quelle
Sie können den OAuth2-Standard nicht wirklich unterstützen, Sie können eine seiner Implementierungen unterstützen oder Ihre eigene implementieren, aber möglicherweise nicht mit anderen Implementierungen arbeiten.
imel96
Du hast recht. Ich habe meine Antwort klargestellt.
Jack Scott
2

Warum verwenden Sie keine Anforderungsheader? Dies trennt Authentifizierungs- / Autorisierungsdaten von den tatsächlich aussagekräftigen Daten der Anforderung und kann für jede Art von Anforderung verwendet werden (die Verwendung eines Anforderungshauptteils auf einem Get sollte normalerweise nicht durchgeführt werden.)

Wenn Sie über eine Berechtigung in den Headern verfügen, können Sie den Benutzer authentifizieren, bevor Sie den Hauptteil der Anforderung analysieren. Dies ist von Vorteil, wenn Ihr System keine Zeit damit verschwenden soll, Daten von einem nicht autorisierten Benutzer zu analysieren.

JBarber
quelle