2009-11-21 41 views
10

Tôi đã cài đặt couchDB v 0.10.0 và đang cố gắng nói chuyện với nó qua python từ lớp Couch được tải xuống từ couchDB wiki. Sự cố là:couchDB, python và xác thực

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

Tôi đã chỉnh sửa tệp local.ini để bao gồm thông tin đăng nhập và mật khẩu chuẩn của mình. Bây giờ tôi có toàn quyền truy cập thông qua futon nhưng không có niềm vui WRT python. Đây có phải là vấn đề về tiêu đề http không?

Tại thời điểm mất mát - cảm ơn!

+0

Bạn đang sử dụng thư viện python nào? Có một số được liệt kê trên trang wiki python (http://wiki.apache.org/couchdb/Getting_started_with_Python) – andyuk

+0

cảm ơn andyuk - Tôi đang sử dụng mã VÍ DỤ trên trang wiki vì nó đơn giản nhất. Tôi cũng đang cố gắng tìm tài liệu couchDB về việc vô hiệu hóa auth (cục bộ) – idiotype

Trả lời

5

Lớp Couch trong ví dụ không chuyển bất kỳ thông tin xác thực nào vào cơ sở dữ liệu, vì vậy nó không phải là một phép lạ mà nó không cho phép các hoạt động đặc quyền. Vì vậy, lựa chọn duy nhất của bạn là:

  • xác thực vô hiệu hóa hoàn toàn (như bạn nói)
  • vượt qua tên người dùng và mật khẩu như một phần của URI
  • vượt qua tên người dùng và mật khẩu là một yêu cầu tiêu đề Authorization HTTP

Nếu bạn muốn chuyển tên người dùng và mật khẩu, thì bạn sẽ cần thay đổi lớp Couch. Gửi tiêu đề yêu cầu HTTP Authorization dễ dàng hơn vì lớp Couch sử dụng lớp httplib.HTTPConnection. Bạn có thể thêm tiêu đề như vậy bên cạnh số Accept theo cách này:

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

Tương tự cho các phương thức yêu cầu HTTP khác.

Các tài liệu trên xác thực cơ bản là ở đây:

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

+0

Tài liệu về các tính năng bảo mật của CouchDB: http://wiki.apache.org/couchdb/Security_Features_Overview – fviktor

+0

cảm ơn cho fviktor phản hồi triệt để. – idiotype

6

Bạn cũng có thể làm:

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

sau đó tất cả các yêu cầu của bạn nên làm việc.

+4

Dường như không phải là tài sản .http trong tài nguyên, nhưng có couch.resource.credentials. Vì vậy, tôi đã đi couch.resource.credentials = (SERVER_USER, SERVER_PASSWD) mà làm việc cho tôi. – David

0

Có một vài bản vá cho python-couchdb cho phép xác thực. Mã có thể sẽ được bao gồm trong Phiên bản 0.7 nhưng cho đến khi đó bạn có thể sử dụng ngã ba tại http://github.com/mdornseif/couchdb-python - nó cho phép bạn sử dụng các URL loại http://user:[email protected]:5984/.

http://blogs.23.nu/c0re/2009/12/running-a-couchdb-cluster-on-amazon-ec2/ (ở dưới cùng) cho biết cách sử dụng mật khẩu CouchDB.

3

Chỉ cần vượt qua nó như một phần của URI ... python-couchdb sẽ phân tích các user/pass ra và sử dụng chúng:

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

+0

Điều này đúng với python-couchdb 0,7 trở lên, vì vậy hãy đảm bảo bạn đã cập nhật. – Redbeard

19

Để concour trả lời của David, (ví dụ: "Đây là cách tôi làm điều đó bằng môđun CouchDB 0,8 ​​trong python 2,6 với couchdb 1.0.2")

ghế = couchdb.Server (couch_server)

couch.resource.thông tin đăng nhập = (USERNAME, PASSWORD)

+0

đã làm việc cho tôi trong một tình huống tương tự ... một khi tôi nhớ đã đặt tên người dùng và mật khẩu của mình trong dấu ngoặc kép! Đó là loại ngụ ý trong câu trả lời của lysdexia ở đây nhưng tôi đề cập đến nó ở đây chỉ trong trường hợp người khác bị mất tích mà vào cuối một ngày dài. Trừ khi tất nhiên bạn đã thực sự xác định chúng ở nơi khác và chỉ sử dụng tên biến ở đây. – rossdavidh

+0

Tôi sử dụng cùng một phương pháp và nó hoạt động tốt mọi lúc. –

+0

@rossdavidh làm cho một điểm tốt. – lysdexia

1

Trên tất cả đều tốt đẹp; nhưng tôi thấy rằng đối với phương thức xác thực oauth so với auth cơ bản, điều này hoạt động thực sự tốt:

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

Lưu ý: Điều này sẽ không hoạt động với xác thực cơ bản; trong trường hợp như vậy, fviktor có những gì tôi coi là câu trả lời tốt nhất. Bạn cũng có thể xem tài liệu tham chiếu bảo mật mà anh ta đã liên kết nếu bạn quan tâm đến các phiên xác thực liên tục.

Các vấn đề liên quan