Platzieren Sie den API-Schlüssel in den Headern oder der URL

76

Ich entwerfe eine öffentliche API für die Daten meines Unternehmens. Wir möchten, dass sich Anwendungsentwickler für einen API-Schlüssel anmelden, damit wir die Verwendung und Überbeanspruchung überwachen können.

Da die API REST ist, ist mein erster Gedanke, diesen Schlüssel in einen benutzerdefinierten Header zu setzen. So habe ich Google, Amazon und Yahoo gesehen. Mein Chef hingegen ist der Meinung, dass die API einfacher zu verwenden ist, wenn der Schlüssel lediglich Teil der URL usw. wird. " Http: //api.domain.tld/longapikey1234/resource ". Ich denke, es gibt etwas zu sagen, aber es verstößt gegen das Prinzip der URL als einfache Adresse dessen, was Sie wollen und nicht wie oder warum Sie es wollen.

Finden Sie es logisch, den Schlüssel in die URL einzufügen? Oder möchten Sie HTTP-Header lieber nicht manuell festlegen, wenn Sie ein einfaches Javascript-Frontend für einige Daten schreiben?

Thomas Ahle
quelle

Antworten:

76

Es sollte in den HTTP-Autorisierungsheader eingefügt werden. Die Spezifikation finden Sie hier https://tools.ietf.org/html/rfc7235

Darrel Miller
quelle
Ich verwende den Authorization-Header bereits für den dritten Teil - den Endbenutzer. Das heißt, der Endbenutzer muss sich bei der App anmelden, um vollen Zugriff auf den Inhalt zu erhalten.
Thomas Ahle
5
@Thomas Die Anzahl der Parameter, die Sie in den Auth-Header einfügen können, ist unbegrenzt. Schauen Sie sich OAuth an, es enthält ungefähr 8 verschiedene Parameterwerte im Header.
Darrel Miller
1
Link Update - Dies ist jetzt RFC 7235 ab Juni 2014
Stephen P
Ich sage nicht, dass Sie falsch liegen, aber wenn Sie sagen " Es sollte sein " - woher wissen Sie das? Wer sagt? (Ich fand diese Frage, weil es scheint, dass Apache oft den Authorization-Header entfernt, bevor PHP-Wesen ausgeführt werden)
JAAulde
2
@JAAulde Ich gehe hier auf weitere Details ein. Bizcoder.com/where-oh-where-does-the-api-key-go Es würde mich interessieren, ob Sie Links zum Apache-Problem haben.
Darrel Miller
67

Wenn Sie ein Argument suchen, das einen Chef ansprechen könnte: Überlegen Sie, was eine URL ist. URLs sind öffentlich. Die Leute kopieren sie und fügen sie ein. Sie teilen sie, sie setzen sie auf Werbung. Nichts hindert jemanden (wissentlich oder nicht) daran, diese URL an andere Personen zu senden. Wenn sich Ihr API-Schlüssel in dieser URL befindet, hat ihn jeder.

Stand
quelle
1
Zusätzlich zu Ihren Hinweisen zur öffentlichen Offenlegung einer URL sind die URL und ein Inline-API-Schlüssel für alle Netzwerkadministratoren sichtbar, die Zugriff auf einen Router, einen Unternehmens-Proxyserver, einen Caching-Server usw. haben.
Adam Caviness
4
@AdamCaviness Nicht mit HTTPS, das alle APIs sowieso implementieren sollten. URL ist verschlüsselt. Als Administrator können Sie nur die DNS-Suche und die mit kommunizierte IP-Adresse sehen, nicht den Inhalt.
Davon
1
@nickdnk, das stimmt. In Bezug auf HTTPS bleiben auch dann vollständige URLs im Browserverlauf! Lustige Sachen. Ich bin kein Fan von sensiblen Inhalten in einer URL.
Adam Caviness
@ AdamCaviness Ja, in diesem Sinne. Ich habe verstanden, dass jemand den Datenverkehr lesen kann, wenn er Zugriff auf den Router hat.
Nickdnk
Und diese API ist ein gutes Beispiel dafür, wie pipedrive.com/en/api nicht funktioniert .
John John Pichler
13

Es ist besser, den API-Schlüssel im Header und nicht in der URL zu verwenden.

URLs werden im Browserverlauf gespeichert, wenn sie vom Browser aus versucht werden. Es ist ein sehr seltenes Szenario. Das Problem tritt jedoch auf, wenn der Back-End-Server alle URLs protokolliert. Möglicherweise wird der API-Schlüssel verfügbar gemacht.

Auf zwei Arten können Sie den API-Schlüssel im Header verwenden

Grundautorisierung:

Beispiel aus Streifen:

curl https://api.stripe.com/v1/charges -u sk_test_BQokikJOvBiI2HlWgH4olfQ2:

curl verwendet das Flag -u, um grundlegende Authentifizierungsdaten zu übergeben (das Hinzufügen eines Doppelpunkts nach Ihrem API-Schlüssel verhindert, dass Sie nach einem Kennwort gefragt werden).

Benutzerdefinierter Header

curl -H "X-API-KEY: 6fa741de1bdd1d91830ba" https://api.mydomain.com/v1/users
Fizer Khan
quelle
1
Warum X-API-KEY? Ist dieses X eine Art HTTP-Spezifikation für benutzerdefinierte Header?
John John Pichler
2

Ich würde den Schlüssel nicht in die URL einfügen, da er gegen diesen losen 'Standard' verstößt, der REST ist. Wenn Sie dies jedoch tun würden, würde ich es in den 'Benutzer'-Teil der URL einfügen.

Beispiel: http: //[email protected]/myresource/myid

Auf diese Weise kann es auch als Header mit basic-auth übergeben werden.

Adam Wagner
quelle
5
Hinweis 1) Dies ist nur eine Abkürzung für die Basisauthentifizierung. 2) Nicht alle HTTP-Clients werden dies berücksichtigen. 3) Mindestens ein großer Browser zeigt eine Phishing-Warnung an.
user359996
@ user359996 Punkte genommen. Als Antwort: 1) Ich habe mich in meinem letzten Satz dem entzogen. 2) Dies wird im Standard ( tools.ietf.org/html/rfc3986 ) erwähnt. Das ist also die Schuld des Kunden. 3) Ich war mir dessen nicht bewusst Obwohl ich denke, dass es sinnvoll ist, frage ich mich, ob dies bei Verwendung als API-Aufruf (XHR) immer noch der Fall ist. Schließlich ging es darum, Auth-Info auf erholsame Weise in die URL aufzunehmen, und ich glaube, ich habe das beantwortet.
Adam Wagner
1

Das Übergeben von API-Schlüsseln in Parametern macht es für Clients schwierig, ihre API-Schlüssel geheim zu halten. Sie neigen dazu, regelmäßig Schlüssel zu verlieren. Ein besserer Ansatz besteht darin, ihn im Header der Anforderungs-URL zu übergeben. Sie können den Benutzerschlüssel-Header in Ihrem Code festlegen. Zum Testen Ihrer Anforderungs-URL können Sie die Postman-App in Google Chrome verwenden, indem Sie den Benutzerschlüssel-Header auf Ihren API-Schlüssel setzen.

himanshu_chawla
quelle
1
Wie führen API-Schlüssel in Parametern dazu, dass Benutzer ihre Schlüssel verlieren?
Heinzlmaen