CouchDB, python и аутентификация

Я установил couchDB v 0.10.0, и я пытаюсь поговорить с ним через python из класса Couch, загруженного из wiki для couchDB. Проблема в том, что:

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

Я вручную отредактировал файл local.ini, чтобы включить мой стандартный логин и пароль osx. Теперь у меня есть полный доступ через futon, но нет радости WRT python. Это проблема заголовка HTTP?

В убытке - спасибо!

Ответ 1

Чтобы ответить на вопрос Дэвида (т.е. "Вот как я это делаю, используя модуль CouchDB 0.8 в python 2.6 с couchdb 1.0.2" )

couch = couchdb.Server(couch_server)

couch.resource.credentials = (USERNAME, PASSWORD)

Ответ 2

Вы также можете сделать:

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

после которого все ваши запросы должны работать.

Ответ 3

Класс Couch в этом примере не передает никакой информации об аутентификации в базу данных, поэтому не чудо, что оно не разрешает привилегированные операции. Таким образом, ваши варианты:

  • полностью отключить проверку подлинности (как вы упомянули)
  • передать имя пользователя и пароль как часть URI
  • передать имя пользователя и пароль в качестве заголовка HTTP Authorization

Если вы хотите передать имя пользователя и пароль, вам нужно будет изменить класс Couch. Отправка заголовка запроса HTTP Authorization проще, поскольку класс Couch использует класс httplib.HTTPConnection. Вы можете добавить такой заголовок рядом с Accept следующим образом:

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

То же самое для других методов HTTP-запроса.

Документация по базовой аутентификации находится здесь:

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

Ответ 4

Просто передайте его как часть URI... python-couchdb будет анализировать пользователя/передавать и использовать их:

http://user:[email protected]:5984

Ответ 5

Выше все хорошо; но я обнаружил, что для методов проверки oauth и базового auth это работает очень хорошо:

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

Примечание. Это не будет работать с базовой аутентификацией; в таком случае у fviktor есть то, что я считаю лучшим ответом. Вы также можете посмотреть справочный материал безопасности, с которым он связан, если вас интересуют постоянные сеансы аутентификации.

Ответ 6

Существует несколько патчей для python-couchdb, которые позволяют аутентификацию. Код, вероятно, будет включен в Версию 0.7, но до тех пор вы можете использовать fork в http://github.com/mdornseif/couchdb-python - он позволяет использовать http://user:[email protected]:5984/.

http://blogs.23.nu/c0re/2009/12/running-a-couchdb-cluster-on-amazon-ec2/ (внизу) показывает, как использовать пароли CouchDB.