2009-11-21 23 views
10

Ich habe couchDB v 0.10.0 installiert und versuche mit ihm über Python von der Couch-Klasse zu sprechen, die von couchDB wiki heruntergeladen wurde. Das Problem ist:couchDB, python und authentification

Create database 'mydb': {'error': 'unauthorized', 'reason': 'You are not a server admin.'} 

I Hand bearbeiten die local.ini Datei meinen Standard osx Login und Passwort enthält. Ich habe jetzt vollen Zugriff über Futon, aber keine Freude WRT Python. Ist das ein http-Header-Problem?

Mit einem Verlust - danke!

+0

Welche Python-Bibliothek verwenden Sie? Es gibt mehrere auf der Python-Wiki-Seite (http://wiki.apache.org/couchdb/Getting_started_with_Python) – andyuk

+0

Dank Andyuk - Ich verwende EXAMPLE-Code, der auf der Wiki-Seite ist, da es am einfachsten ist. Ich versuche auch zu finden couchDB doc auf auth (lokal) deaktivieren – idiotype

Antwort

5

Die Klasse Couch im Beispiel übergibt keine Authentifizierungsinformationen an die Datenbank. Es ist also kein Wunder, dass privilegierte Operationen nicht zugelassen werden. So Ihre einzigen Optionen sind:

  • deaktivieren Authentifizierung vollständig (wie Sie bereits erwähnt)
  • übergeben Sie den Benutzernamen und das Kennwort als Teil des URI
  • übergeben Sie den Benutzernamen und das Kennwort als Authorization HTTP-Request-Header

Wenn Sie einen Benutzernamen und ein Kennwort übergeben möchten, müssen Sie die Klasse Couch ändern. Das Senden eines HTTP-Anforderungsheaders Authorization ist einfacher, da die Couch-Klasse die Klasse httplib.HTTPConnection verwendet. Sie können neben dem Accept ein diese Weise einen solchen Header hinzufügen:

headers = { 
    "Accept": "application/json", 
    "Authorization": "Basic " + 'username:password'.encode('base64')[:-1]} 

Das Gleiche gilt für die anderen HTTP-Request-Methoden.

Die Dokumentation auf der Basis-Authentifizierung ist hier:

http://books.couchdb.org/relax/reference/security

+0

Dokumentation über die Sicherheitsfunktionen von CouchDB: http://wiki.apache.org/couchdb/Security_Features_Overview – fviktor

+0

danke für die gründliche Antwort fviktor. – idiotype

6

Sie können auch tun:

db = couchdb.Database("http://your.url/yourdb") 
db.resource.http.add_credentials(username, password) 

nach dem alle Ihre Anfragen funktionieren sollte.

+4

Scheint keine .http-Eigenschaft in der Ressource zu sein, aber es gibt couch.resource.credentials. Also habe ich couch.resource.credentials = (SERVER_USER, SERVER_PASSWD) was für mich funktioniert. – David

0

Es gibt verschiedene Patches für python-couchdb, die eine Authentifizierung ermöglichen. Der Code wird wahrscheinlich in Version 0.7 enthalten sein, aber bis dahin können Sie den Fork unter http://github.com/mdornseif/couchdb-python verwenden - es ermöglicht Ihnen, URLs vom Typ http://user:[email protected]:5984/ zu verwenden.

http://blogs.23.nu/c0re/2009/12/running-a-couchdb-cluster-on-amazon-ec2/ (am unteren Rand) zeigt, wie Sie CouchDB Passwörter verwenden.

19

Um David Antwort concour, (dh „Das ist, wie ich tun sie Modul CouchDB 0,8 ​​in Python 2.6 mit couchdb 1.0.2")

Couch = couchdb.Server (couch_server)

couch.resource verwenden.Anmeldeinformationen = (BENUTZERNAME, PASSWORT)

+0

arbeitete für mich in einer ähnlichen Situation ... einmal erinnerte ich mich, meinen Benutzernamen und mein Passwort in Anführungszeichen zu setzen! Es ist irgendwie in der Antwort von Lysdexia impliziert, aber ich erwähne es hier für den Fall, dass jemand anderes am Ende eines langen Tages fehlt. Es sei denn, Sie haben sie tatsächlich anderswo definiert und verwenden hier nur Variablennamen. – rossdavidh

+0

Ich benutze die gleiche Methode und es funktioniert die ganze Zeit gut. –

+0

@rossdavidh macht einen guten Punkt. – lysdexia

1

Oben sind alle nett; aber ich habe festgestellt, dass für oauth Validierungsmethoden im Vergleich zu grundlegenden auth, das funktioniert wirklich gut:

from couchdb import Server, Session 
auth = Session() 
auth.name = USERNAME 
auth.password = PASSWORD 
s = Server('http://localhost:5984/', session=auth) 
db = s['dbname'] 

Hinweis: Dies wird nicht mit Standardauthentifizierung arbeiten; In einem solchen Fall hat fviktor das, was ich für die beste Antwort halte. Sie können sich auch das Sicherheitsreferenzmaterial ansehen, mit dem er verlinkt ist, wenn Sie an persistenten Authentifizierungssitzungen interessiert sind.