2015-07-24 6 views
25

Es gibt zahlreiche Online-Ressourcen, die JavaScript-APIs für den Zugriff auf ihre Dienste bereitstellen. Um es klarer zu sagen, werde ich meine Frage auf das Beispiel MapBox stützen, aber das gilt auch für viele andere Dienste in verschiedenen Bereichen.So sichern Sie das JavaScript API Access Token?

Wenn jemand einen solchen Dienst in einer Web-Anwendung verwenden (wie die Kartenbilder von MapBox zum Beispiel), müssen sie in der Regel Registrieren/Anmelden und erhalten einen Zugriffstoken auf den Dienst zuzugreifen.

Jetzt, wenn ich die API von der Server-Seite verwenden würde - gibt es kein Problem: Ich weiß, dass mein Token sicher irgendwo auf dem Server gespeichert ist und nur bei der Kommunikation zwischen meinem Server und dem Dienstanbieter "ausgesetzt". Im Falle einer JavaScript-API (zum Beispiel wenn ich Leaflet verwende, um eine Karte von MapBox zu rendern), soll ich mein Zugriffs-Token in einem JavaScript haben, das dem Webbrowser des Benutzers ausgesetzt ist - und so macht es es extrem einfach, jemandes Zugangs-Token zu finden. In meinem Beispiel zeigt die Verwendung von Leaflet und das Öffnen von "Dev Tools" in Firefox einfach, welches Token sie in einer Minute des aufmerksamen Lesens ihres JavaScript-Codes verwenden.

Dieses Token sollte jedoch als sehr sicher betrachtet werden. Die Verwendung des Dienstes wird anhand der Authentifizierung dieses Tokens verfolgt. Wenn Sie den Dienst aufgrund seiner Nutzung bezahlen, wird dies sehr kritisch, aber selbst wenn Sie das nicht tun (wie wenn Sie einen kostenlosen/Starter/nicht bezahlten Plan verwenden) - die Nutzung des Dienstes ist begrenzt und ich möchte sicher sein nur ich benutze es.

Natürlich gibt es Strategien wie IP/Domain-Filterung von Service Provider, aber es scheint nicht, dass alle Service Provider dies unterstützen - zum Beispiel, MapBox scheint nicht (oder ich habe nicht gefunden es). Letztendlich kann ich den Dienst auch über meinen Webserver ausführen, aber das ist sehr schwer.

Gibt es eine Möglichkeit, das Zugriffstoken zu sichern, das von einer JavaScript-API für den Zugriff auf einen externen Dienst verwendet wird, vorausgesetzt, dass JavaScript im Browser eines Benutzers ausgeführt wird?

+0

Nein, wenn der Client das Token an seinen Server senden muss, kann der Client auf dieses Token zugreifen - es gibt keinen Weg um es herum. Es gibt jedoch einige Authentifizierungsarchitekturen, die einem Benutzer nicht das vollständige Geheimnis zur Verfügung stellen, um herauszufinden, was der Dienst bietet. – Bergi

Antwort

6

Zugriff beschränkt mit CORS

Machen Sie Ihren Web-Server die Zugriffstoken auf einer Ajax-Anforderung von Ihnen Javascript mit CORS-Setup zurückzukehren. Mit dieser Methode kann Token mit Ihrer App erfasst werden.

Geben Sie Tokens auf autorisierte Benutzer

Sie können auch die Authentifizierung auf Ihrem Webserver hinzufügen, nur begrenzten Zugang zu den Benutzern, um Ihnen zu ermöglichen. Token kann mit dieser Methode aber nur von autorisierten Benutzern erfasst werden.

Proxy-Anfragen

Die einzige Möglichkeit, vollständig, dass Token zu schützen Proxy ist die Anfragen über den Server. Token kann mit dieser Methode nicht erfasst werden.

1

Lesen Sie weiter auf CORS headers Diese können Sie einschränken, welche Domäne einen Remote-Webdienst aufrufen kann.

5

JavaScript-API-Token (und alle Client-Token tatsächlich) sind für den Client immer sichtbar (es sei denn, sie werden nur serverseitig wie im Knoten verwendet). Es gibt keinen Weg dahin. Wie Sie bereits erwähnt haben, besteht die einzige Möglichkeit, einen API-Schlüssel wirklich zu sichern und privat zu halten, darin, ihn auf dem Server zu speichern und dann den Server aufzufordern, die Anforderung im Auftrag des Clients auszuführen.

1

Ich werde nur über Map Imagery APIs wie Mapbox sprechen, es scheint, dass leider nur Dienste wie Google Maps, Here Maps, Bing Maps usw. IP/Domain-Filterung durch Service Provider oder diese Art von Sicherheit anbieten, alle Angebote basieren auf OSM Ich habe es nicht vorgeschlagen. Wie Justin Poehnelt sagte, ist der einzige zuverlässige Weg, einen Proxy zu erstellen, aber es ist normalerweise verboten. Das finde ich in the ToU of Mapbox:

Sie können nicht Map Assets verteilen, auch von einem Cache, von proxying oder durch einen Screenshot oder ein anderes statisches Bild statt Zugriff auf Map Assets durch das Mapping-APIs.

Verwandte Themen