UNPKG

@incdevco/framework

Version:
609 lines (377 loc) 14.8 kB
/* 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>');} ]);