lib/IdentityProvider.js
/**
* Created by mgoria on 11/12/15.
*/
'use strict';
import {MissingLoginProviderException} from './Exception/MissingLoginProviderException';
import {IdentityProviderMismatchException} from './Exception/IdentityProviderMismatchException';
import {InvalidProviderIdentityException} from './Exception/InvalidProviderIdentityException';
/**
* 3rd Party identity provider (Amazon, Facebook, Google, etc.)
*/
export class IdentityProvider {
/**
* @returns {string}
*/
static get AMAZON() {
return 'www.amazon.com';
}
/**
* @returns {string}
*/
static get FACEBOOK() {
return 'graph.facebook.com';
}
/**
* @returns {string}
*/
static get GOOGLE() {
return 'accounts.google.com';
}
/**
* @param {String} providerName
* @returns {Array}
*/
static ALIASES(providerName) {
let aliases = [];
switch(providerName) {
case IdentityProvider.AMAZON:
aliases = ['www.amazon.com', 'amazon'];
break;
case IdentityProvider.FACEBOOK:
aliases = ['graph.facebook.com', 'facebook'];
break;
case IdentityProvider.GOOGLE:
aliases = ['accounts.google.com', 'google', 'google-oauth2'];
break;
}
return aliases;
}
/**
* @param {Object} providers
* @param {String} providerName
* @param {Object} identityMetadata
*/
constructor(providers, providerName, identityMetadata) {
if (Object.keys(providers).indexOf(providerName) === -1) {
throw new MissingLoginProviderException(providerName);
}
if (identityMetadata.hasOwnProperty('provider') &&
IdentityProvider.ALIASES(providerName).indexOf(identityMetadata.provider) === -1) {
throw new IdentityProviderMismatchException(providerName, identityMetadata.provider);
}
if (!identityMetadata.access_token || !identityMetadata.tokenExpirationTime) {
throw new InvalidProviderIdentityException(providerName);
}
this._providers = providers;
this._name = providerName;
this._userToken = identityMetadata.access_token;
this._tokenExpTime = new Date(identityMetadata.tokenExpirationTime);
this._userId = identityMetadata.user_id || null;
}
/**
* @returns {Object}
*/
get providers() {
return this._providers;
}
/**
* @returns {String}
*/
get name() {
return this._name;
}
/**
* @returns {String}
*/
get userToken() {
return this._userToken;
}
/**
* @returns {Date}
*/
get tokenExpirationTime() {
return this._tokenExpTime;
}
/**
* @returns {boolean}
*/
isTokenValid() {
if (this.userToken && this.tokenExpirationTime) {
return this.tokenExpirationTime > new Date();
}
return false;
}
/**
* @returns {String}
*/
get userId() {
return this._userId;
}
/**
* @param {String} name
* @returns {Object}
*/
config(name) {
if (!this.providers.hasOwnProperty(name)) {
throw new MissingLoginProviderException(name);
}
return this.providers[name];
}
}