2011-01-05 5 views
15

Ich entwickle einen Open-Source-Python-powered Twitter-Client, und auf die Twitter API zugreifen und Login mit OAuth, ich habe meinen Client mit Twitter registriert und Sie haben mir einen einzigartigen Verbraucherschlüssel und ein Verbraucher-Token gegeben (fortan als "Entwicklerschlüssel" bezeichnet). Diese sind für meinen Kunden eindeutig und alle Kopien meines Clients müssen denselben Entwicklerschlüssel verwenden. Jetzt muss ich den Entwicklerschlüssel in einem Python-Skript (main.py) verwenden und da es ein Skript ist, gibt es keine Binärdatei. Außerdem muss ich meinen Code auf GitHub hochladen, da ich git auf GitHub für die Inhaltsverfolgung verwende. Wie behalte ich meinen Entwicklerschlüssel geheim? Bitte beachten Sie, dass ich beabsichtige, den gleichen Client an Benutzer zu verteilen.Wie man einen Entwickler Schlüssel in einem Python-Skript, das auf GitHub gehostet

Ein Schlüsselring scheint die beste Option, aber ich möchte eine Möglichkeit, dass nur die Anwendung auf den Schlüsselbund zugreifen kann, nicht einmal seine Benutzer (außerhalb der Anwendung). Und niemand sollte herausfinden können, wie man auf den Schlüsselring zugreift, indem er meinen Code betrachtet.

Hinweis: "Um die Twitter API zu verwenden, müssen Sie zuerst eine Clientanwendung registrieren. Jede von Ihnen registrierte Clientanwendung erhält einen Consumer Key und ein Secret. Dieses Schlüssel- und Geheimschema ähnelt der Öffentlichkeit und private Schlüssel, die in Protokollen wie ssh für diejenigen verwendet werden, die vertraut sind.Dieser Schlüssel und dieses Geheimnis werden in Verbindung mit einer OAuth-Bibliothek in Ihrer Programmiersprache Ihrer Wahl verwendet, um jede Anfrage, die Sie an die API stellen, zu signieren signing-Prozess, dass wir vertrauen, dass der Verkehr, der sich selbst identifiziert, Sie tatsächlich ist. " - http://dev.twitter.com/pages/auth

+0

Ich glaube nicht, dass dies möglich ist. Warum könnte ich den Code, der ihn implementiert, einfach kopieren und außerhalb der Anwendung ausführen? – aaronasterling

+0

Sie sollten xauth verwenden, um einen oauth-Schlüssel aus dem Benutzernamen und dem Kennwort abzurufen und dann den oauth-Schlüssel zu verwenden –

+0

Ein Entwickler muss Twitter seine/ihre Gründe für xAuth erklären, bevor er die Erlaubnis erhält, xAuth zu verwenden. – tarantinofan

Antwort

3

Erweitern auf Apalala Antwort, ich glaube, was gemeint ist, ist ein "Proxy" -Webdienst. Die Leute schicken dir ihre Anfragen und du unterzeichnest sie in ihrem Namen und schickst sie an Twitter, sobald sie deinem Bewerbungszugang natürlich erlauben.

Sie müssen sich keine Sorgen machen, dass Leute Sie spammen, weil sie sich ohnehin auf Twitter einloggen müssen, um es zu benutzen.

Das einzige Problem, wie anderswo, ist, wie kann ich die Anwendung genug Vertrauen es in erster Linie zu lassen :)

3

Der Schlüssel muss außerhalb des Quellcodes liegen und über die Befehlszeile oder eine Konfigurationsdatei an das Programm übergeben werden. Es gibt keine Möglichkeit, den Schlüssel zu verbergen, wenn Sie ihn in den Quellcode einbetten (ein Debugger, z. B., wird es anzeigen).

Noch wichtiger, um Kollisionen zu vermeiden oder Benutzer den Schlüssel kennen zu lernen, sollte nicht unterschiedliche Benutzer den gleichen Schlüssel teilen. In der Regel wird ein Webdienst eingerichtet, der den Schlüssel kennt und mit dem endgültigen Server (Twitter) kommuniziert. Die Client-Software würde mit dem Dienst unter Verwendung eines Schlüssels pro Benutzer kommunizieren.

+0

Ich denke, ein Web-Service wäre die beste Option, aber jemand könnte es gefälscht, um den Schlüssel zu bekommen, oder? Der Schlüssel, über den ich spreche, ist der "Verbraucherschlüssel" und das "Verbrauchergeheimnis", die in allen Instanzen meines Kunden gleich sind. – tarantinofan

+1

Wie können sie einen Webservice, der sich auf Ihrer Hardware befindet, spoofen? Python-Client -> Ihr Web-Service (mit welcher Authentifizierung Sie Ihre Benutzer auch verwenden möchten) -> twitter api (mit Ihrem Consumer-Key und Ihrem geheimen Schlüssel). Alle Benutzer können Ihren Webservice aufrufen, was eine Art der Authentifizierung erfordert (z. B. einen Schlüssel, den Sie an jeden Benutzer verteilen). –

0

Erstellen Sie eine Konfigurationsdatei, in der Sie den Schlüssel behalten. Veröffentlichen Sie die ursprüngliche Konfigurationsdatei nicht in git-hub.

Sie können Python Config Module (Overkill) oder YAML (meine Wahl) oder einfache Dateien verwenden.

Wenn Sie möchten, dass Benutzer nur aufstehen, können Sie eine Eingabeaufforderung erstellen, die nur das erste Mal in einem System ausgeführt wird und die Konfigurationsdatei durch Eingabe von Benutzereingaben generiert.

+0

Ich habe nichts zu GitHub gepostet. :) Momentan befinden sich das Konsumentengeheimnis und der Konsumentenschlüssel in .gitignore. Aber wenn Leute anfangen zu benutzen, werden sie das gleiche Konsumentengeheimnis und Konsumentenschlüssel benötigen, da diese alle Instanzen des Kunden identifizieren. – tarantinofan

1

Ich würde keinen Schlüssel mit dem Code verteilen; Wenn Leute es benutzen wollen, müssen sie nur ihren eigenen Schlüssel beantragen. Jeder andere Ansatz kann missbraucht werden.

+0

Der Schlüssel, über den ich spreche, ist der "Consumer Key" und das "Consumer Secret", die in allen Instanzen meines Clients gleich sind. – tarantinofan

7

Sie OAuth.io für diesen Zweck verwenden können.

Das Konzept ist einfach:

  • Sie müssen nur Ihre API-Schlüssel in den Schlüsselmanager von OAuth.io setzen
  • in Ihrem Quellcode, verwenden Sie die OAuth.io öffentlichen Schlüssel

Ihr geheimer Schlüssel wird auf diese Weise nicht durchgesickert.

prüfen diese Blogpost mit Twitter API mit OAuth.io: http://blog.oauth.io/api-call-using-twitter-api/

Der komplette Codebeispiel (in Javascript) ist auf JSFiddle: http://jsfiddle.net/thyb/kZExJ/5

$('button').click(function() { 
    OAuth.initialize('oEcDIQahkO4TUAND-yTs-H6oY_M') //OAuth.io public key 
    OAuth.popup('twitter', function(err, res) { 
     // res contains tokens (res.oauth_token and res.oauth_token_secret) 
     res.get('/1.1/statuses/home_timeline.json').done(function(data) { 
      // do what you want with data 
     }) 
    }) 
}) 
Verwandte Themen