DE EN

Ein CouchDB Login für Cloudant

von

Cloudant wurde auf CouchDB aufgebaut. Das ist kein Geheimnis. IBM hat ein paar eigene Sachen in das Projekt mit eingebracht, was sie auch zurück in das CouchDB Projekt fließen lassen wollen. Wie auch immer, wenn man jetzt eine Session mit modernen CouchDB Mitteln erstellen möchte, wird man erstmal keinen Erfolg haben. Cloudant sagt nämlich, Sie verwenden CouchDB 1.0.2, eine veraltete Version.

Cloudant Auth wie mit CouchDB

Der Hauptunterschied ist, Cloudant unterstützt kein serverseitiges Hashing von Passwörtern. Mit CouchDB kann man einen Benutzer hinzufügen, indem man einfach sagt: hier, das ist mein Passwort! Und CouchDB fügt dann etwas Passwort-Salz hinzu, hashed das Passwort, und los geht’s. Ältere Server-Versionen überlassen eben das dem Benutzer.

So wie das eben jetzt noch mit Cloudant der Fall ist, falls man das Authentifizierungs-Layer von CouchDB nutzen möchte. Cloudant hat zwar sein eigene Authentifizierungsmöglichkeiten. Manchmal will man aber Cloudant und CouchDB gleichzeitig verwenden. Und dann macht es natürlich Sinn, nicht zwei verschiedene API’s implementieren zu müssen.

Lassen Sie uns zunächst den Cloudant Authentication Ebene umgehen.

Dafür müssen wir die Ebene ausschalten, damit wir wieder an die CouchDB _users Datenbank herankommen. Die Information, wie das genau geht, ist tief in der Cloudant Dokumentation vergraben. Um ehrlich zu sein, empfand ich die Beschreibung mehr verwirrend als hilfreich. Hier ist also, was ich gemacht habe.

curl -X PUT -d '{
  "couchdb_auth_only": true
}' "https://<cloudant-user>:<cloudant-pass>@<your-project>.cloudant.com/<your-database>/_security"

In dem man dieses JSON via HTTP PUT an den Cloudant Server schickt, schaltet man Cloudant ab und CouchDB an:

{
  "couchdb_auth_only": true
}

Die Dokumentation spricht von weiteren Parametern, doch die waren in meinem Fall nicht nötig.

Ein neuer Benutzer kann dann so erstellt werden:

curl -X PUT -H "Content-Type: application/json" -d '{
  "password_sha": "329983971fc5dc8d157ccb10f2c0e71d5725cfff",
  "salt": "638769a280f1c46b18707e9db3edf844",
  "roles": ["my-role"],
  "type": "user"
}' "https://<cloudant-user>:<cloudant-pass>@<your-project>.cloudant.com/_users/org.couchdb.user:test5"

Im Detail muss man also dass folgende JSON an /_users/org.couchdb.user: schicken:

{
  "password_sha": "329983971fc5dc8d157ccb10f2c0e71d5725cfff",
  "salt": "638769a280f1c46b18707e9db3edf844",
  "roles": ["my-role"],
  "type": "user"
}

Das “salt” sollte möglichst zufällig generiert werden. Mit PHP ist das so möglich:

$salt = uniqid(mt_rand(), true);

Damit kann dann das Passwort gesalzen und anschließend gehashed werden. Das funktioniert, in dem man das Salt einfach an das Passwort anhängt und dann mittels SHA1 verhashed:

$password_sha = sha1($password . $salt)

Das war’s dann. Was noch überbleibt ist, eine Session zu erstellen:

curl -X POST https://<your-project>.cloudant.com/_session -d 'name=test5&password=test4'
{"ok":true,"name":"test5","roles":["my-role"]}

Ab diesem Punkt übernehmen dann Cookies.

Bildrechte

Tags: #couchdb #nosql #cloudant

Newsletter

ABMELDEN