2010-03-12 25 views
9

Angenommen, ich habe eine Website mit vielen Informationen zu unseren Produkten. Ich möchte, dass einige unserer Kunden (einschließlich uns!) In der Lage sind, unsere Produkte nach verschiedenen Methoden zu suchen, einschließlich:Best Practices für sichere APIs?

1) Ziehen von Daten aus AJAX-Aufrufen, die Daten in coolen, JavaScripty-ways zurückgeben 2) Erstellen von iPhone-Anwendungen, die diese Daten verwenden; 3) Andere Webanwendungen verwenden diese Daten für ihr eigenes Ende.

Normalerweise würde ich nur eine API erstellen und damit fertig sein. Diese Daten sind jedoch eher vertraulich - das heißt, wir wollen nicht, dass unsere Wettbewerber jeden Morgen alle unsere Produkte nachschlagen und dann automatisch ihre Preise unterbieten. Und wir möchten auch sehen können, wer das System missbraucht. Wenn also jemand zehn Millionen komplexe Aufrufe pro Tag an unsere API sendet und unseren Server in die Knie zwingt, können wir sie abschalten.

Mein nächster logischer Schritt wäre dann, einen Entwicklerschlüssel zu erstellen, um den Zugriff zu beschränken - was für Web-Anwendungen gut wäre, aber nicht so sehr für AJAX-Aufrufe. (So ​​wie ich es sehe, müssten sie den Schlüssel im JavaScript bereitstellen, das im Klartext und leicht zu sehen ist, und daher gibt es überhaupt keine Sicherheit. Insbesondere, wenn wir die Schlüssel unserer Entwickler auf unserer Website verwenden würden um diese AJAX-Anrufe zu machen.)

Also meine Frage: nachdem ich mich eine Weile bei Oauth und OpenID umgesehen habe, bin ich mir nicht sicher, ob es eine Lösung gibt, die alle drei der oben genannten Probleme behandeln würde. Gibt es eine Art kanonische "Best Practices" für Entwicklerschlüssel, oder können Oauth und OpenID AJAX-Aufrufe auf eine Art handhaben, die ich noch nicht gelernt habe, oder fehlt mir etwas völlig?

Antwort

4

Ich denke, dass 2-beinigen OAuth ist, was Sie # 2 und # 3 erfüllen möchten. Für # 1 würde ich vorschlagen, dass anstelle des Kunden, der JS-Anfragen direkt gegen Ihre Anwendung absetzt, diese Anfragen stattdessen durch ihre eigene Web-Anwendung übertragen werden könnten.

+0

Aber wie kann dieser API-Proxyserver gesichert werden, um zu verhindern, dass Angreifer ihn missbrauchen? – Constantin

1

Eine mittlere Lösung ist, einen API-Schlüssel zu erfordern; und dann verlangen, dass derjenige, der es benutzt, es tatsächlich nicht direkt mit dem AJAX verwendet; sondern wickeln ihre Anrufe in einer serverseitigen Anfrage, zB:

AJAX -> customer server -> your server -> customer server -> user 

einen einfachen PHP-API für Interessenten erstellen soll nicht zu kompliziert sein, und Ihre eigenen iPhone-Anwendungen wären natürlich den Mitte des Menschen ausgeschnitten, Versand mit ihr eigener API-Schlüssel.

+0

Es muss einen Weg geben, dies zu tun - macht Google Analytics das nicht, indem es Ihnen erlaubt, einige JS direkt in Ihre Seite einzufügen und irgendwie diesen sicheren API-Aufruf macht? Ich frage mich, wie sie das machen. –

1

OAuth und OpenID haben wahrscheinlich nicht viel mit den AJAX-Aufrufen direkt zu tun. Höchstwahrscheinlich haben Sie vor Ihrem AJAX-Handler einen Autorisierungsfilter, der einen Cookie überprüft, und vielleicht wird dieser Cookie als Ergebnis einer OpenID-Authentifizierung gesetzt.

Es scheint, als ob dies auf eine Frage von "how do I prevent screen scraping" kommt. Wenn nur eingeloggte Kunden die Preise sehen, ist das eine Sache, aber vorausgesetzt, Sie sind wie die meisten Einzelhandels-Websites und Ihre Barriere für Kunden-Anmeldung ist so niedrig wie möglich, das hilft nicht wirklich.

Und, hey, wenn Ihre Preise sind nicht verfügbar, Sie nicht in Suchmaschinen wie Froogle oder Nextag oder PriceGrabber angezeigt werden. Aber das ist eher eine Geschäftsstrategieentscheidung als eine Programmierung.