@incdevco/framework
Version:
node.js lambda framework
609 lines (377 loc) • 14.8 kB
JavaScript
/* global angular FB gapi localStorage moment */
angular.module('auth', [
'user'
])
.directive('authenticate', [
'Auth',
'FacebookLogin',
'GoogleSignIn',
'$injector',
'$timeout',
function (Auth, FacebookLogin, GoogleSignIn, $injector, $timeout) {
var providers = [
{
key: FacebookLogin.key,
user: FacebookLogin.user,
render: function () {
FacebookLogin.render(Auth.deferred, Auth.logins);
},
templateUrl: 'auth/templates/facebook-login.html'
},
{
key: GoogleSignIn.key,
user: GoogleSignIn.user,
render: function () {
GoogleSignIn.render(Auth.deferred, Auth.logins);
},
templateUrl: 'auth/templates/google-sign-in.html'
}
];
return {
link: function ($scope) {
$scope.providers = providers;
Auth.deferred.promise
.then(function (result) {
$scope.success(result);
},function (exception) {
$scope.failure(exception);
}, function (status) {
$scope.progress(status);
});
$timeout(function () {
providers.forEach(function (provider) {
provider.render();
});
});
},
replace: true,
restrict: 'E',
scope: {
failure: '=',
progress: '=',
success: '='
},
templateUrl: 'auth/templates/authenticate.html'
};
}
])
.directive('authenticateProvider', [
function () {
return {
replace: true,
restrict: 'E',
scope: {
provider: '='
},
templateUrl: 'auth/templates/provider.html'
};
}
])
.factory('Auth', [
'COGNITO_IDENTITY_POOL_ID',
'COGNITO_IDENTITY_POOL_REGION',
'CognitoIdentity',
function (identityPoolId, identityPoolRegion, CognitoIdentity) {
return {
login: function (logins, roleSessionName) {
return CognitoIdentity({
IdentityId: null,
IdentityPoolId: identityPoolId,
Logins: logins,
RoleSessionName: roleSessionName || 'web-client'
}, identityPoolRegion);
}
};
}
])
.filter('versionedUrl', [
'VERSION',
function (VERSION) {
return function (input) {
var output = '';
if (input) {
output = '/' + VERSION + input;
}
return output;
}
}
])
.provider('OldAuth', [
function () {
var enabled = {};
this.enabled = enabled;
this.$get = [
'CognitoIdentity',
'COGNITO_IDENTITY_POOL_ID',
'COGNITO_IDENTITY_POOL_REGION',
'$injector',
'$q',
'$rootScope',
function (CognitoIdentity,
IdentityPoolId,
IdentityPoolRegion,
$injector,
$q,
$rootScope) {
var credentials,
credentialsKey = 'auth.credentials',
expiration,
identity,
identityKey = 'auth.identity',
provider,
providerKey = 'auth.provider',
service;
function authenticate() {
if (!service.deferred) {
service.deferred = $q.defer();
$rootScope.$broadcast('please-authenticate', service.deferred);
service.deferred.promise
.then(function (logins) {
return login(logins);
});
}
return service.deferred.promise;
}
function getLocal() {
var pCredentials = localStorage.getItem(credentialsKey);
var pIdentity = localStorage.getItem(identityKey);
var pProvider = localStorage.getItem(providerKey);
var exp;
var now = moment();
//console.log('getLocal', pCredentials, pIdentity);
if (pCredentials) {
pCredentials = JSON.parse(pCredentials);
if (pCredentials) {
exp = moment(pCredentials.expireTime);
}
}
if (pIdentity) {
pIdentity = JSON.parse(pIdentity);
}
if (exp && exp.isAfter(now)) {
credentials = pCredentials;
provider = pProvider;
identity = pIdentity;
$rootScope.$broadcast('aws.credentials', credentials);
$rootScope.$broadcast('cognito.identity', identity);
$rootScope.$broadcast('authenticated', provider);
return true;
}
return false;
}
function login(logins, roleSessionName) {
return CognitoIdentity({
IdentityId: null,
IdentityPoolId: IdentityPoolId,
Logins: service.logins,
RoleSessionName: roleSessionName || 'web-client'
}, IdentityPoolRegion)
.then(function (result) {
setLocal(result.credentials, result.identity, Object.keys(service.logins));
service.deferred = null;
return result;
})
.catch(function (exception) {
service.deferred = null;
throw exception;
});
}
function setLocal(pCredentials, pIdentity, pProviders) {
var exp = moment(pCredentials.expireTime);
if (exp.isAfter()) {
credentials = JSON.stringify(pCredentials);
localStorage.setItem(credentialsKey, credentials);
credentials = JSON.parse(credentials);
expiration = exp;
identity = JSON.stringify(pIdentity);
localStorage.setItem(identityKey, identity);
identity = JSON.parse(identity);
provider = pProviders[0];
localStorage.setItem(providerKey, provider);
//console.log('providers', pProviders);
$rootScope.$broadcast('authenticated', provider, pProviders);
} else {
console.error('credentials expired', pCredentials);
}
}
service = {
authenticate: function () {
console.log('authenticate');
if (this.is()) {
console.log('is');
return $q.resolve(true);
} else {
console.log('not');
return authenticate();
}
},
deauthenticate: function () {
credentials = null;
deferred = null;
expiration = null;
identity = null;
localStorage.setItem(credentialsKey, null);
localStorage.setItem(identityKey, null);
$rootScope.$broadcast('deauthenticated');
return $q.resolve(true);
},
deferred: null,
enabled: function (provider) {
return enabled[provider] || false;
},
expired: function () {
if (!expiration || expiration.isBefore()) {
return true;
}
return false;
},
getAwsCredentials: function () {
return credentials;
},
has: function () {
if (!provider) {
provider = localStorage.getItem(providerKey);
}
if (provider) {
return true;
} else {
return false;
}
},
is: function () {
if (credentials
&& expiration
&& expiration.isAfter(moment())) {
return true;
} else {
return getLocal();
}
},
logins: {}
};
return service;
}
];
}
])
.provider('FacebookLogin', [
function () {
var key = 'graph.facebook.com';
this.$get = [
'FACEBOOK_APP_ID',
'$q',
'$rootScope',
'$window',
function (appId, $q, $rootScope, $window) {
var ready = $q.defer(), user;
$window.fbAsyncInit = function() {
FB.init({
appId : appId,
cookie : true,
xfbml : true,
version : 'v2.8'
});
FB.AppEvents.logPageView();
ready.resolve(true);
};
function login(deferred, logins, response) {
logins[key] = response.authResponse.accessToken;
deferred.resolve(true);
FB.api('/me', {
fields: 'email,name,picture'
}, function (response) {
user = response;
});
}
var service = {
key: key,
render: function (deferred, logins) {
deferred.notify('Attempting FacebookLogin');
return ready.promise
.then(function () {
FB.getLoginStatus(function (response) {
if (response.status === 'connected') {
login(deferred, logins, response);
}
});
FB.Event.subscribe('auth.authResponseChange', function (response) {
console.log('auth.authResponseChange', response);
if (response.status === 'connected') {
// user is logged into facebook
login(deferred, logins, response);
} else {
// user is not logged into facebook
}
});
});
},
revoke: function () {
},
user: user
};
$rootScope.$on('send-user-data', function () {
if (user) {
$rootScope.$broadcast('user.facebook', user);
}
});
return service;
}
];
}
])
.provider('GoogleSignIn', [
function () {
var key = 'accounts.google.com';
this.$get = [
'GOOGLE_CLIENT_ID',
'$q',
'$rootScope',
function (ClientId, $q, $rootScope) {
var user;
var service = {
key: key,
render: function (deferred, logins, options, elementId) {
elementId = elementId || 'GoogleSignIn';
options = options || {};
options.height = options.height || 50;
options.longtitle = options.longtitle || true;
options.scope = options.scope || 'email profile';
options.theme = options.theme || 'dark';
options.width = options.width || 250;
options.onfailure = function (exception) {
console.error(exception);
deferred.notify('GoogleSignIn Exception');
deferred.reject(exception);
};
options.onsuccess = function (result) {
deferred.notify('GoogleSignIn Successful');
user = result;
logins[key] = user.getAuthResponse().id_token;
deferred.resolve(user);
};
deferred.notify('Attempting GoogleSignIn');
console.log('options', options);
gapi.signin2.render(elementId, options);
},
revoke: function () {
}
};
$rootScope.$on('send-user-data', function () {
if (user) {
$rootScope.$broadcast('user.google', user);
}
});
return service;
}
];
}
]);
angular.module('auth')
.run([
'$templateCache',
function ($templateCache) {
$templateCache.put('auth/templates/authenticate.html', '<div layout="column" layout-padding> <authenticate-provider provider="provider" ng-repeat="provider in providers"></authenticate-provider></div>');
$templateCache.put('auth/templates/facebook-login.html', '<div class="fb-login-button" data-max-rows="1" data-size="large" data-button-type="login_with" data-show-faces="false" data-scope="email,public_profile" data-auto-logout-link="true" data-use-continue-as="false">FacebookLogin</div>');
$templateCache.put('auth/templates/google-sign-in.html', '<div id="GoogleSignIn"><span>GoogleSignIn</span></div>');
$templateCache.put('auth/templates/provider.html', '<div layout="column"> <div ng-show="provider.user"> <span>{{provider.user | json}}</span> </div> <div ng-hide="provider.user" ng-include="provider.templateUrl"> </div></div>');}
]);