===== CouchBase =====
==== CouchBase Lite ====
=== Authentication ===
== Registration of new users ==
Creating a User is done via the Admin Port of the REST API: \\
http://developer.couchbase.com/mobile/develop/guides/sync-gateway/administering-sync-gateway/authorizing-users/index.html
curl -X POST http://localhost:4985/${db}/_user/ -d '{"name":"foo", "password":"bar"}'
== Restrict reading the document ==
Channels legitimate a user to read documents.
A user is legitimated to access a channel.
User's documents are marked by channels.
== Restrict writing the document to it's owner ==
This is done inside the **Sync function**, which is defined during the start of the Sync Gateway
# this required the currently logged in user - to be the sam as mentioned in oldDoc's user property
requireUser(oldDoc.user)
The write restriction may be defined by:
* rolename
* channel
* username
http://developer.couchbase.com/mobile/develop/guides/sync-gateway/sync-function-api-guide/validation/index.html
=== Manual Authentication ===
* Your app prompts user for credentials
* Your app directly contacts your app server with these credentials
* Your app server creates a session on the Sync Gateway, which returns a cookie
* Your app server returns this cookie to your app
http://wiki.nginx.org/Modules
NGinx may be used
* to implement a reverse Proxy, to protect the connection with SSL
* with embedded PERL
* provide the user registration API
==== CouchBase ====
The NoSQL Server. Stores data as documents.
==== Sync Gateway ====
== Glossary ==
|DataBase| The database maps to a bucket. A single Sync Gateway may publish buckets as databases. Below the DB **gw** points to the bucket **sync_gateway**|
|Server| The server is the storage, where the Sync Gateway will put hte data in. It may be a Couchase Server or a Walrus Server (File System DB) "server":"C:\Couchbase\Walrus\default.walrus"|
{
"log": ["CRUD", "CRUD+", "HTTP", "HTTP+", "Access", "Cache", "Changes", "Changes+"],
"interface":":4984",
"adminInterface":":4985",
"facebook":{
"register":true
},
"databases":{
"gw":{
"server":"http://localhost:8091",
"bucket":"sync_gateway",
"sync":`function(doc) {
if (doc._deleted) {
requireUser(oldDoc.writers);
return;
}
if (!doc.title || !doc.creator || !doc.writers) {
throw({forbidden: "Missing required properties"});
} else if (doc.writers.length == 0) {
throw({forbidden: "No writers"});
}
if (oldDoc == null) {
requireUser(doc.creator);
} else {
requireUser(oldDoc.writers);
if (doc.creator != oldDoc.creator) {
throw({forbidden: "Can't change creator"});
}
}
// add channel with the username to the doc
channel ("channel_" + doc.creator);
// add access to the channel username to the user
access (doc.creator, [doc.creator, "*"]);
}`,
"users": {
"GUEST": {"disabled": true, "admin_channels": ["*"] }
}
}
},
"persona" : {
"origin" : "http://example.com/",
"register" : true
}
}
== Create user, assign channel==
User has to have access to it's own channel, in order to have the ability to read docs.
# Sync Gateway request: Create a new user via a direct Sync Gateway request
$method = "PUT"
$resource = "http://192.168.191.210:4985/gw/_user/skipxxx"
$body = "{
""name"":""skipxxx"",
""password"":""pass"",
""admin_channels"":[""channel_skipxxx""],
""admin_roles"":[""editor""],
""disabled"":false
}"
echo $body;
Invoke-RestMethod -Method $method -Uri $resource -Body $body -ContentType 'application/json'
== Create a doc which is assigned to user's channel==
Assigning is done automatically, by the **sync_funcion**, when a user creates a document. see
// add channel with the username to the doc
channel ("channel_" + doc.creator);
Alternatively the doc may be added by powershell
# create a document by REST API
$now = $(get-date);
$resource = "http://192.168.191.210:4985/gw/"
$method = "POST"
$body = "{
""type"":""FromConsoleType3"",
""title"":""Document from Console3"",
""checked"":""true"",
""created_at"":""$now"",
""creator"":""skipxxx"",
""writers"":[""skipxxx""]
}"
$securepassword = ConvertTo-SecureString "pass" -AsPlainText -Force
$credentials = New-Object System.Management.Automation.PSCredential("skipxxx", $securepassword)
Invoke-WebRequest -Uri $resource -Method POST -Credential $credentials -Body $body -ContentType application/json
This is how the document may look like
{
"_sync": {
"rev": "1-ec4f884fae1ded971b5fbd18f9c07060",
"sequence": 7,
"history": {
"revs": [
"1-ec4f884fae1ded971b5fbd18f9c07060"
],
"parents": [
-1
],
"bodies": [
""
],
"channels": [
[
"channel_skipxxx"
]
]
},
"channels": {
"channel_skipxxx": null
},
"access": {
"skipxxx": {
"skipxxx": 7
}
},
"time_saved": "2015-06-21T11:55:23.1276655-07:00"
},
"checked": "true",
"created_at": "06/21/2015 20:55:17",
"creator": "skipxxx",
"title": "Document from Console3",
"type": "FromConsoleType3",
"writers": [
"skipxxx"
]
}
The channels which this doc is assigned to is listed here:
"channels": {
"channel_skipxxx": null
},
== Now the docs may be synced ==
The docs may be synced, without setting any channel.
Then all available docs will be pulled
pullReplication = database.createPullReplication(syncUrl);
pullReplication.setContinuous(true);
pushReplication = database.createPushReplication(syncUrl);
pushReplication.setContinuous(true);
pushReplication.start();
pullReplication.start();