Ich entwerfe eine REST-API mit Autorisierung / Authentifizierung über einen API-Schlüssel.
Ich habe versucht, herauszufinden, was der beste Ort dafür ist, und habe herausgefunden, dass viele Leute die Verwendung eines benutzerdefinierten HTTP-Headers vorschlagen, wie zum ProjectName-Api-Key
Beispiel:
ProjectName-Api-Key: abcde
es ist aber auch möglich und ideologisch korrekt, den Authorization
Header mit einem benutzerdefinierten Schema zu verwenden, zB:
Authorization: ApiKey abcde
Andererseits stellte ich fest, dass ein benutzerdefiniertes Autorisierungsschema von einigen Clients unerwartet und nicht unterstützt werden kann und ohnehin zu benutzerdefiniertem Code führt. Daher ist es besser, einen benutzerdefinierten Header zu verwenden, da Clients keine Erwartungen daran haben.
Auf welche Weise möchten Sie einen API-Schlüssel senden?
quelle
Authorization: Bearer <token>
Header und es gab nie ein einziges Problem damit. Die Token sind JWTs .Bearer
Schema ausschließlich mit oAuth2 verwendet. Wenn Sie es getrennt von oAuth anwenden, wird es als missbräuchlich angesehen. Warum ist es richtig, dieses Schema zu verwenden, wenn es kein oAuth gibt? Übrigens hatte ich Probleme mit der Auswahl eines Autorisierungstyps für meine API. Die API wird nur für einen vertrauenswürdigen Dienst verfügbar sein. Daher habe ich den Clientanmeldeinformationsfluss von oAuth2 untersucht und in meinem Fall keinen Vorteil im Vergleich zu ApiKey festgestellt.ApiKey
umbenannt und alsAccess Token
dem Client gewährt interpretiert wird. Das ist eine Art philosophischer Aspekt. Ich habe mich entschieden, keine komplexen Definitionen mitzubringen, wenn sich mein Fall in einfachen Worten beschreiben lässt, und habe mich dafür entschieden, ihn einfach "ApiKey" zu nennen. Wenn Ihr Protokoll den oAuth-Standard implementiert, kann ich der Verwendung zustimmenBearer
, aber ich denke, dass dieses Schema nicht angewendet werden kann.Antworten:
Wenn Sie die Autorisierung verwenden, müssen Sie konsistent sein
Einige werden argumentieren, dass das Folgende unnötig ist ( und vor nicht allzu langer Zeit hätte ich dem zugestimmt ), aber heutzutage sollten wir, wenn wir den
Authorization
Header verwenden, den Typ des Tokens mitteilen , da API-Schlüssel per se nicht selbstbeschreibend sind 1 .Warum halte ich es für notwendig und warum halte ich es für wichtig? Weil heutzutage die Unterstützung verschiedener Authentifizierungs- / Autorisierungsprotokolle ein Muss ist. Wenn wir den
Authorization
Header für alle diese Protokolle verwenden möchten, müssen wir unseren Authentifizierungsservice konsistent machen. Die Art und Weise zu kommunizieren, welche Art von Token wir senden und welches Autorisierungsprotokoll angewendet werden soll, sollte ebenfalls im Header stehen.Früher war mir das egal, aber nachdem ich mit App-Client-Apps gearbeitet hatte, deren Updates nicht garantiert waren (hauptsächlich Handys und Sensoren), fing ich an. Bei der Implementierung von Sicherheit habe ich mich vorsichtiger verhalten, damit ich sie erweitern kann, ohne dass sich Kunden damit herumschlagen und ohne dass der Server zu viel Arbeit leistet.
Bedenken
Die Probleme, mit denen ich bei der Implementierung meiner eigenen Systeme konfrontiert war, ähnelten denen, die ich kommentiert habe.
Sagen Sie Clients , sagen Sie Bibliotheken, Frameworks, Reverse-Proxys .
Vorteile
Ein wichtiger Vorteil ist der Cache. Shared Caches werden den Header nicht zwischenspeichern (und das ist natürlich gut so), es sei denn, Sie sagen etwas anderes.
Also Autorisierung oder benutzerdefinierter Header?
Meiner Erfahrung nach hat die Implementierung meines eigenen
Authorization
Schemas genau so viel Arbeit (oder mehr) gekostet als die Implementierung benutzerdefinierter Autorisierungsheader, mit dem kleinen Unterschied, dass ich mehr Gestaltungsfreiheit und mehr Kontrolle über den Cache habe, wenn ich benutzerdefinierte Header verwendet habe. Der Grund ist ziemlich dumm, die meiste Zeit habe ichCache-control
aufno-cache
oder gesetztno-store
, was es mir ermöglicht, die Anrufe an den Server deterministischer zu machen (dies ist wichtig, wenn es um das Verfolgen und Testen geht), unabhängig von der Topologie des Netzwerks.1: Ich finde diese Antwort in Bezug auf API-Schlüssel sehr klar
quelle
X-
ist ab 2012 veraltet: stackoverflow.com/a/3561399/923720