web-dev-qa-db-de.com

Gibt es eine Möglichkeit, einen API-Schlüssel auf einer Frontend-Seite zu sichern?

Mein Service ermöglicht die Konvertierung von HTML-Dokumenten in PDF mithilfe einer POST -Anforderung .. _. Diese Datei wird hauptsächlich auf dem Backend des Servers meines Kunden verwendet, sodass der für die Kommunikation verwendete API-Schlüssel beibehalten wird Privatgelände.

Jetzt denke ich an eine Möglichkeit, den Besuchern meines Kunden zu ermöglichen, meinen Service im Namen meines Client-API-Schlüssels aufzurufen, ohne diesen sicheren API-Schlüssel verfügbar zu machen.

Mein Hauptanliegen ist hier die Sicherheit. Wenn mein Client eine XHR POST -Anforderung hinzufügt, die den API-Schlüssel enthält, kann jemand diesen API-Schlüssel zu seinem eigenen Zweck verwenden und das Konto meines Kunden missbrauchen.

Ich könnte nach Domain filtern, aber dies ist leicht gefälscht, so dass es nicht möglich ist.

Ich habe mich gefragt, ob es einen Weg gibt, einen privaten Dienst anzurufen und identifiziert zu werden, ohne zu riskieren, dass seine Identität von der Client-Seite gestohlen wird.

6
Cyril N.

Wenn Sie dieses Sublet für authentifizierte Benutzer bereitstellen, ist es ziemlich einfach, ihnen eindeutige Schlüssel zu geben (etwas, das ihre Benutzer-ID oder Sitzung mit dem API-Schlüssel und einem anfänglichen Zeitstempel abhängt und vor dem Zugriff nach Protokollen sucht) die API). Wenn Sie dies im offenen Web ohne jegliche Benutzerauthentifizierung durchführen, wird die Ratenbegrenzung in der Tat sehr schwierig. Im Allgemeinen möchten Sie eine Kombination aus Sitzungshashes, IP-Adresse, Betriebssystem und Browserdaten verwenden, um ein anonymes Profil zu erstellen, das einen temporären Schlüssel im Frontend erhält. Ein ziemlich guter Weg, dies zu tun, besteht darin, Benutzer durch ein CAPTCHA zu zwingen, bevor sie einen temporären Schlüssel bereitstellen, der ihnen eine begrenzte Anzahl von Verwendungen des permanenten Schlüssels ermöglicht. Jeder Benutzer, dessen IP/Browser/Sitzung mit den vorhandenen Attributen eines bekannten Clientschlüssels übereinstimmt, wird auf diesen umgeleitet (und kann CAPTCHA überspringen). Jeder, der nicht zu einem bestehenden Profil passt, erhält den CAPTCHA. Das macht Sie zu einem weniger attraktiven Ziel für Spoofing. Darüber hinaus sollten Sie die gesamte Rate innerhalb einer vernünftigen Anzahl von Treffern pro Tag je nach Verkehrstyp, den Sie erwarten (oder sich leisten können), beschränken, nur damit Sie keine Überraschungen erleben. Dies ist die minimale Sicherheit, die Sie benötigen, wenn das Geld Ihres Kunden bei jeder Verwendung des API-Schlüssels online ist. Sie benötigen eine einfache Datenbank, um diese "Profile" zu speichern, die Verwendung zu verfolgen, auf Bestien zu prüfen und die aktuell gültigen Client-Schlüssel zu verwalten. Client-Schlüssel sollten immer regelmäßig abgelaufen sein - entweder mit einem Zeitunterschied zum Erstellungszeitpunkt oder einem regulären Cron-Prozess oder einer maximalen Anzahl von Verwendungen usw.

Eine andere Sache, die ich häufig mache, ist eine auf einer Kurve basierende Ratenbegrenzung. Wenn ich denke, dass 5 Verwendungen pro Minute zum Beispiel sinnvoll sind, fügt jede Verwendung nach 5 Verwendungen in einer Minute aus einer Sitzung eine Verzögerung von einem Bruchteil einer Sekunde hinzu * die Anzahl der Verwendungen in der letzten Minute, quadriert, vor den Daten wird serviert.

Die beste Antwort wäre, dies alles hinter ein Login-System zu stellen und that zu sichern.

1
joshstrike

Sie können JWT-Token meiner Meinung nach verwenden. Auf der Grundlage von Benutzername, Kennwort oder anderen Informationen können Sie eindeutige JWT-Token für verschiedene Benutzer generieren. Jeder kann diese JWT-Token entschlüsseln, nicht jedoch das eindeutige Sicherheitstoken.

Wenn Sie Tokens mehr Sicherheit hinzufügen möchten, verwenden Sie JWE-verschlüsselte Web-Tokens. 

Weitere Informationen zu diesen Schemata finden Sie unter https://medium.facilelogin.com/jwt-jws-and-jwe-for-not-so-dummies-b63310d201a3

1
GraphicalDot

es gibt keine gute Möglichkeit, Frontend sicher zu speichern, aber meine Empfehlung lautet: 

ist eine API, die HMAC-Signatur von Anforderungen in Kombination mit der OAuth-Authentifizierung verwendet. Der API-Schlüssel ist tatsächlich ein Signaturschlüssel. Der Schlüssel wird nicht übertragen. Der API-Schlüssel kann zwar immer noch im Frontend gefunden werden, ist jedoch unbrauchbar, da Sie immer noch das OAuth-Token benötigen, um eine gültige Anfrage zu senden.

ich weiß, dass sich Benutzer anmelden müssen, aber Sie können dies als Vorteil betrachten, da Sie zumindest protokollieren können, wer die App verwendet, indem Sie Informationen von oauth erhalten.

bitte bedenken Sie die sichere Aufbewahrung des Back-End!

1
Lars Hendriks

Angenommen, Sie verwenden OAuth Systemtyp). Verwenden Sie in diesem Fall den Zugriffstoken-Mechanismus, der den Zugriff auf private API-/Benutzerdaten im Namen des Benutzers (Client) ermöglicht, ohne dessen/deren Daten preiszugeben Anmeldeinformationen oder API-Schlüssel (Authentifizierungsschlüssel), auch das Zugriffstoken kann je nach Zeit/Nutzung abgelaufen sein.

Beispiel: Das Zugriffstoken wird für einen einzelnen Endpunkt generiert, bei dem es sich um den HTML-Konvertierungsendpunkt handeln kann, und läuft nach Abschluss der Aktion ab.

https://auth0.com/docs/tokens/access-token

Der folgende Blog-Beitrag ist hilfreich, um Ihr Authentifizierungssystem zu entwickeln https://templth.wordpress.com/2015/01/05/implementing-authentication-with-tokens-for-restful-applications/

1
Shahul Hameed

Hashing ist eine anständige Option und sollte auf jeden Fall durchgeführt werden. Für eine absolut sichere Methode, die nicht zu viel Komplexität hinzufügen würde, könnten Sie einfach den Autorisierungs-/API-Schlüssel entfernen, indem Sie eine eigene API für die Schnittstelle mit der API erstellen. Auf diese Weise können Sie sowohl die Arten von Dingen einschränken, die mit dem API-Schlüssel ausgeführt werden können, als auch den API-Schlüssel vollständig für den Benutzer verdecken

0
krflol