lib/Security.js
/**
* Created by mgoria on 6/17/15.
*/
'use strict';
import Kernel from 'deep-kernel';
import {MissingLoginProviderException} from './Exception/MissingLoginProviderException';
import {Token} from './Token';
import {LocalToken} from './LocalToken';
import {UserProvider} from './UserProvider';
/**
* Deep Security implementation
*/
export class Security extends Kernel.ContainerAware {
/**
* Defines all class private properties
*
* @param {String} identityPoolId
* @param {Object} identityProviders
*/
constructor(identityPoolId = null, identityProviders = {}) {
super();
this._identityPoolId = identityPoolId;
this._identityProviders = identityProviders;
this._token = null;
this._userProvider = null;
this._userProviderEndpoint = null;
}
/**
* @returns {string}
*/
static get PROVIDER_AMAZON() {
return 'www.amazon.com';
}
/**
* @returns {string}
*/
static get PROVIDER_FACEBOOK() {
return 'graph.facebook.com';
}
/**
* @returns {string}
*/
static get PROVIDER_GOOGLE() {
return 'accounts.google.com';
}
/**
* @returns {Object}
*/
get identityProviders() {
return this._identityProviders;
}
/**
* @returns {Object}
*/
get identityPoolId() {
return this._identityPoolId;
}
/**
* @returns {UserProvider}
*/
get userProvider() {
if (!this._userProvider) {
this._userProvider = new UserProvider(this._userProviderEndpoint, this.container.get('resource'));
}
return this._userProvider;
}
/**
* Booting a certain service
*
* @param {Kernel} kernel
* @param {Function} callback
*/
boot(kernel, callback) {
// @todo: remove this compatibility hook
let globals = kernel.config.globals || kernel.config;
this._identityProviders = globals.security.identityProviders;
this._userProviderEndpoint = globals.userProviderEndpoint;
this._identityPoolId = kernel.config.identityPoolId;
callback();
}
/**
* @param {String} name
* @returns {Object}
*/
getLoginProviderConfig(name) {
for (let providerName in this._identityProviders) {
if (!this._identityProviders.hasOwnProperty(providerName)) {
continue;
}
if (providerName === name) {
return this._identityProviders[providerName];
}
}
throw new MissingLoginProviderException(name);
}
/**
* @returns {Object}
*/
get amazonLoginProviderConfig() {
return this.getLoginProviderConfig(Security.PROVIDER_AMAZON);
}
/**
* @returns {Object}
*/
get facebookLoginProviderConfig() {
return this.getLoginProviderConfig(Security.PROVIDER_FACEBOOK);
}
/**
* @returns {Object}
*/
get googleLoginProviderConfig() {
return this.getLoginProviderConfig(Security.PROVIDER_GOOGLE);
}
/**
* @returns {null|Token}
*/
get token() {
return this._token;
}
/**
* @param {String} providerName
* @param {String} userToken
* @param {String} userId
* @param {Function} callback
* @returns {Token}
*/
login(providerName, userToken, userId, callback) {
// check if providerName is defined
this.getLoginProviderConfig(providerName);
let TokenImplementation = this._localBackend ? LocalToken : Token;
this._token = new TokenImplementation(this._identityPoolId, providerName, userToken, userId);
this._token.userProvider = this.userProvider;
this._token.getCredentials(callback);
return this._token;
}
/**
* @param {Function} callback
* @returns {Token}
*/
anonymousLogin(callback) {
let TokenImplementation = this._localBackend ? LocalToken : Token;
this._token = new TokenImplementation(this._identityPoolId);
this._token.userProvider = this.userProvider;
this._token.getCredentials(callback);
return this._token;
}
}