Harbourmaster

About

The Harbourmaster application is the backbone of the Harbourmaster SSO. It provides the API which powers all other applications.
https://hub.docker.com/r/valiton/harbourmaster/

Its main API is the REST API, which contains a full documentation with Swagger: http://YOUR_HARBOURMASTER_URL/docs

As well as the Rest API, it provides a change notification mechanism that allows notifications to be received for example, when a user changes their profile data (not included in the Freemium version).

The Harbourmaster stores data in a MongoDB.

Modular Architecture

The Harbourmaster comprises a core module and a couple of feature extending modules listed. Not all modules are include in the Freemium version.

Module Name Description In Freemium
harbourmaster Core module with all API required for basic SSO YES
hms-module-user-confirmable Adds API for user registration confirmation YES
hms-module-user-tokens Adds API to assign tokens to users, used in combination with mobile SDK YES
hms-module-anonymous-sessions Adds API for handling anonymous sessions YES
hms-module-oauth2 Adds OAuth2 API NO
hms-module-purchases Adds API to assign purchases (paid one time) to users NO
hms-module-entitlements Adds API to assign entitlements (paid subscription) to users NO
hms-module-entitlements-postentitlement-ciscom-crm Adds API to check subscription status with a external ciscom CRM NO
hms-module-notificator-kinesis Adds change notifications using AWS Kinesis NO
hms-module-notificator-sqs Adds change notifications using AWS SQS NO
hms-module-notificator-redis-sentinel Adds change notifications using Redis, also Redis Sentinel compatible NO
hms-module-managed-subscriptions Adds API to manage newsletter subscription and advertisement permissions, one tenant can have one newsletter account NO
hms-module-multiclient-subscriptions Adds API to manage newsletter subscription and advertisement permissions, one tenant can have multiple newsletter accounts NO

License

The Harbourmaster Freemium is licensed under the attached LICENSE.

To start the Harbourmaster you need to accept the license by passing the LICENSE=accept, to display the license pass LICENSE=view

LICENSE=<accept|view>

Simple command to view just the license and dont run all the containers

docker run -e LICENSE=view valiton/harbourmaster

Configuration

The necessary configuration of the Harbourmaster is defined with environment variables.

LICENSE=<accept|view>

REDIS_PORT_6379_TCP_ADDR=<ip of redis>  #compatible with docker link redis
REDIS_PORT_6379_TCP_PORT=<prot of redis> #compatible with docker link redis

MONGO_PORT_27017_TCP_ADDR=<ip of mongodb> #compatible with docker link mongo
MONGO_PORT_27017_TCP_PORT=<prot of mongodb> #compatible with docker link mongo 


# used for seed script run, shared values with usermanger 
HARBOURMASTER_TENANT=<teante name > e.g. thunder
USERMANAGER_HMS_USER_KEY=<usermanager key| 20 char hex format> e.g.  32be04fb9495229f3e4f
USERMANAGER_HMS_USER_SECRET_KEY=<usermanager secret key random string> e.g. 58c94af9f955eebebaf81195d57f774fe7a9d834efd519c8588d184914ff

Docker run

Start a mongodb and redis as a container:

docker run -d --name=mongo mongo:3.2
docker run -d --name=redis redis

Start the Harbourmaster server:

docker run --name=thunder-harbourmaster -it -e LICENSE=accept --link mongo:mongo --link redis:redis valiton/harbourmaster

Seed the mongodb with an initial data set; this is necessary because all API endpoints need a logged in user. The seedscript creates the initial user.

docker exec -it thunder-harbourmaster bash -c "node /app/scripts/seed-create-thunder-tenant.js"

Backup

The Quick Start Guide repository contains a backup script which can be used as a starting point to create an automated backup process for the MongoDB. It is recommended to use a Cron job to automate and schedule the backup prodecure.

API

The Harbourmaster provides a HTTP REST API. Its main API is the REST API, which is full documents with swagger. http://YOUR_HARBOURMASTER_URL/docs

The basic API structure example:

<server> domain where the harbourmaster is deployed to.
<TENANT> placeholder for the tenant to be used.
<resource> placeholder for the resource to be used.
<nestedResource> placeholder for a nested resource.

http://<server>/v1/<TENANT>/<resource>
http://<server>/v1/<TENANT>/<resource>/<ID>
http://<server>/v1/<TENANT>/<resource>/<ID>/<nestedResource>

API responses

Positive response

All positive responses have this general JSON structure:

{
 "status": 1,
 "responseCode":  <HTTP_RESPONSE_CODE>,
 "data": { <DATA> }
}

Error response

All error responses have this general JSON structure:

{
 "status": 0,
 "message": "<MESSAGE>",
 "responseCode": <HTTP_RESPONSE_CODE>
}

Policies

Policies in the Harbourmaster are a very flexible way to grant access to resources in the Harbourmaster. The policy system is loosely inspired by the Amazon AWS IAM policies.

All Harbourmaster API endpoints verify access based on the policy of the requesting user.

The API endpoint is represented as action and the resource, depending on the context of the created/updated/shown/deleted data.

The actions and resources involved in the Harbourmaster API are listed in the swagger documentation.

A Policy consists of one or many statements, which are structured as follows:

  • Effect: can be Allow or Deny
  • Tenant: the tenant where the policy should apply; gets converted in a regular expression
  • Action: represents an API endpoint action; gets converted in a regular expression
  • Resource: the resource which is affected by the action; get converted in a regular expression
    • Special Resource [currentUser] access is only granted to the resource owned by the accessing user

Policy Example

Full access to all actions on all resource in all tenants:

{"Statement":[
 {"Tenant":"*", "Effect":"Allow","Action":"*","Resource":"*"}
]}

currentUser User can read and edit his own data

{ "Statement": [
 { "Tenant": "thunder", "Effect": "Allow", "Action": "hms:login", "Resource": "[currentUser]" },
 { "Tenant": "thunder", "Effect": "Allow", "Action": "hms:updateUserPassword", "Resource": "[currentUser]" },
 { "Tenant": "thunder", "Effect": "Allow", "Action": "hms:getUserServices", "Resource": "[currentUser]" },
 { "Tenant": "thunder", "Effect": "Allow", "Action": "hms:getUser", "Resource": "[currentUser]" },
 { "Tenant": "thunder", "Effect": "Allow", "Action": "hms:updateUser", "Resource": "[currentUser]" },
 { "Tenant": "thunder", "Effect": "Allow", "Action": "hms:listUserEntitlements", "Resource": "[currentUser]" },
 { "Tenant": "thunder", "Effect": "Allow", "Action": "hms:listAllowedTenants", "Resource": "[currentUser]" }
]}