Benutzerdefinierter HTTP-Autorisierungsheader

124

Ich habe mich gefragt, ob es akzeptabel ist, benutzerdefinierte Daten in einen HTTP-Autorisierungsheader einzufügen. Wir entwerfen eine RESTful-API und benötigen möglicherweise eine Möglichkeit, eine benutzerdefinierte Autorisierungsmethode anzugeben. Nennen wir es als FIRE-TOKENAuthentifizierung.

Wäre so etwas gültig und erlaubt gemäß der Spezifikation: Authorization: FIRE-TOKEN 0PN5J17HBGZHT7JJ3X82:frJIUN8DYpKDtOLCwo//yllqDzg=

Der erste Teil der zweiten Zeichenfolge (vor dem ':') ist der API-Schlüssel, der zweite Teil ist ein Hash der Abfragezeichenfolge.

NRaf
quelle

Antworten:

133

Das in RFC2617 definierte Format ist credentials = auth-scheme #auth-param. In Übereinstimmung mit Fumanchu denke ich, dass das korrigierte Autorisierungsschema so aussehen würde

Authorization: FIRE-TOKEN apikey="0PN5J17HBGZHT7JJ3X82", hash="frJIUN8DYpKDtOLCwo//yllqDzg="

Wo FIRE-TOKENist das Schema und die beiden Schlüssel-Wert-Paare sind die Auth-Parameter. Obwohl ich glaube, dass die Anführungszeichen optional sind (aus Anhang B von p7-auth-19) ...

auth-param = token BWS "=" BWS ( token / quoted-string )

Ich glaube, dies entspricht den neuesten Standards, wird bereits verwendet (siehe unten) und bietet ein Schlüsselwertformat für die einfache Erweiterung (wenn Sie zusätzliche Parameter benötigen).

Einige Beispiele für diese auth-param-Syntax finden Sie hier ...

http://tools.ietf.org/html/draft-ietf-httpbis-p7-auth-19#section-4.4

https://developers.google.com/youtube/2.0/developers_guide_protocol_clientlogin

https://developers.google.com/accounts/docs/AuthSub#WorkingAuthSub

StarTrekRedneck
quelle
4
Die einfache Speicher-API von Amazon bietet ein weiteres Beispiel.
Bischof
18

Fügen Sie es in einen separaten, benutzerdefinierten Header ein.

Das Überladen der Standard-HTTP-Header wird wahrscheinlich mehr Verwirrung stiften als es wert ist und das Prinzip der geringsten Überraschung verletzen . Dies kann auch zu Interoperabilitätsproblemen für Ihre API-Client-Programmierer führen, die handelsübliche Toolkits verwenden möchten, die nur die Standardform typischer HTTP-Header (z. B. Authorization) verarbeiten können.

Brian Kelly
quelle
3
Dies ist möglicherweise schwieriger zu korrigieren, als es scheint. Der Link, den fumanchu bereitstellt (in einem Kommentar zu seiner Antwort), erklärt, warum die Einführung eines benutzerdefinierten Headers die zusätzliche Belastung mit sich bringt, das Cache-Steuerelement jetzt manuell korrekt einstellen zu müssen.
Jon-Eric
4
Wenn Sie eine Cross-Origin-Anfrage über den Browser stellen, befinden Sie sich jetzt im Gebiet vor dem Flug, nur aufgrund des benutzerdefinierten Headers, in dem Sie dies sonst hätten vermeiden können. Für bestimmte Anwendungen summieren sich diese Anforderungen.
Wil Moore III
31
Riesige Nein zu benutzerdefinierten Authentifizierungsheadern. Der spezifikationsstandardisierte AuthorizationHeader mit Ihrem eigenen benutzerdefinierten Schema sollte mehr als ausreichend sein. Außerdem vermeiden Sie Origin-Anfragen vor dem Flug, wie @wilmoore angibt. Benutzerdefinierte Schemata stören keinen einigermaßen modernen HTTP-Server, den ich kenne. Wenn Sie Ihr eigenes Schema verwenden, müssen Sie es selbst analysieren - keine Bibliothek sollte in Konflikt geraten (andernfalls ist die Bibliothek schlecht geschrieben).
Les Hazlewood
7
Ein guter Grund für die Übertragung von Anmeldeinformationen im AuthorizationHeader und nicht in einem benutzerdefinierten Header besteht darin, dass Proxys und Protokollierer die Informationen als vertraulich behandeln.
Eron Wright
15

Nein, dies ist keine gültige Produktion gemäß der Definition "Anmeldeinformationen" in RFC 2617 . Sie geben ein gültiges Auth-Schema an, aber die Auth-Param-Werte müssen die Form haben token "=" ( token | quoted-string )(siehe Abschnitt 1.2), und in Ihrem Beispiel wird "=" nicht verwendet.

Fumanchu
quelle
1
Das stimmt nicht Auf Seite 5 des Dokuments finden Sie ein Beispielformat: Autorisierung: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ ==
NRaf
11
Das ist richtig. Wie tools.ietf.org/html/draft-ietf-httpbis-p7-auth-16#section-2.3.1 sagt, wurde die Notation "b64token" aus Gründen der Kompatibilität mit vorhandenen Authentifizierungsschemata eingeführt und kann nur einmal pro verwendet werden Herausforderung / Anmeldeinformationen. Neue Schemata sollten daher stattdessen die Syntax "auth-param" verwenden, da sonst zukünftige Erweiterungen nicht möglich sind. " Siehe auch die dortige Cache-Diskussion zum Ausführen der Authentifizierung in benutzerdefinierten Headern.
Fumanchu
9

Alte Frage, die ich kenne, aber für Neugierige:

Ob Sie es glauben oder nicht, dieses Problem wurde vor ca. 2 Jahrzehnten mit HTTP BASIC gelöst, das den Wert als base64-codierten Benutzernamen: password übergibt. (Siehe http://en.wikipedia.org/wiki/Basic_access_authentication#Client_side )

Sie könnten das Gleiche tun, so dass das obige Beispiel wie folgt aussehen würde:

Authorization: FIRE-TOKEN MFBONUoxN0hCR1pIVDdKSjNYODI6ZnJKSVVOOERZcEtEdE9MQ3dvLy95bGxxRHpnPQ==
Mike Marcacci
quelle
4
Ich würde von dieser Antwort abraten, da gemäß einem Kommentar zu einer anderen Antwort hier die hier verwendete Notation der Kompatibilität mit vorhandenen Schemata dient und für neue Erweiterungen nicht empfohlen wird.
Whymarrh