From 29f9f68fee50de2120ab052bbd73a93a0179d67a Mon Sep 17 00:00:00 2001 From: Fergal Moran Date: Sun, 10 Jan 2016 23:07:05 +0000 Subject: [PATCH 1/3] Maybe not --- bower.json | 3 +- client/app/app.js | 36 ++++++++++---- client/app/services/auth/login.service.js | 58 +++++++++++++---------- client/index.html | 1 + 4 files changed, 62 insertions(+), 36 deletions(-) diff --git a/bower.json b/bower.json index 5fc2fd4..ad65dce 100755 --- a/bower.json +++ b/bower.json @@ -38,7 +38,8 @@ "smalot-bootstrap-datetimepicker": "~2.3.4", "js-data-angular": "~3.1.0", "ui-select": "angular-ui-select#~0.13.2", - "ngInfiniteScroll": "~1.2.1" + "ngInfiniteScroll": "~1.2.1", + "satellizer": "~0.13.3" }, "devDependencies": { "angular-mocks": ">=1.2.*", diff --git a/client/app/app.js b/client/app/app.js index c86dbec..78f98ec 100755 --- a/client/app/app.js +++ b/client/app/app.js @@ -19,9 +19,10 @@ angular.module('dssWebApp', [ 'angular-jwt', 'http-auth-interceptor', 'angular-smilies', + 'satellizer', 'angulartics.google.analytics' ]) - .config(function ($stateProvider, $sceDelegateProvider, $httpProvider, $urlRouterProvider, $locationProvider, $provide, + .config(function ($stateProvider, $sceDelegateProvider, $httpProvider, $urlRouterProvider, $locationProvider, $provide, $authProvider, ngClipProvider, jwtInterceptorProvider, $analyticsProvider, dialogsProvider, DSProvider, DSHttpAdapterProvider, SERVER_CONFIG, STORAGE) { $urlRouterProvider @@ -30,7 +31,27 @@ angular.module('dssWebApp', [ //$httpProvider.defaults.headers.common.Accept = 'application/json'; $httpProvider.defaults.useXDomain = true; $httpProvider.interceptors.push('AuthInterceptor'); + $authProvider.baseUrl = SERVER_CONFIG.apiUrl + '/'; + $authProvider.loginUrl = '_login'; + $authProvider.authToken = 'JWT'; + $authProvider.facebook({ + name: 'facebook', + url: '/_login/?backend=facebook', + clientId: '154504534677009', + authorizationEndpoint: 'https://www.facebook.com/v2.5/dialog/oauth', + redirectUri: window.location.origin + '/', + requiredUrlParams: ['display', 'scope'], + scope: ['email'], + scopeDelimiter: ',', + display: 'popup', + type: '2.0', + popupOptions: {width: 580, height: 400} + }); + $authProvider.twitter({ + //qmvJ6tptgd8G9T9WYp6P3Q + url: '/_login?backend=twitter', + }); ngClipProvider.setPath("bower_components/zeroclipboard/dist/ZeroClipboard.swf"); $analyticsProvider.firstPageview(true); @@ -54,6 +75,11 @@ angular.module('dssWebApp', [ 'https://dsscdn.blob.core.windows.net/mixes/**' ]); $locationProvider.html5Mode(true); + + $authProvider.google({ + clientId: '248170132962-5km115budk9h84raa26hdmnnqdj8ivkl.apps.googleusercontent.com' + }); + }).run(function ($http, $rootScope, $state, $window, LoginService, Session, SocketService) { $rootScope.isPlaying = false; @@ -78,14 +104,6 @@ angular.module('dssWebApp', [ }); }; - hello.init({ - facebook: '154504534677009', - twitter: 'qmvJ6tptgd8G9T9WYp6P3Q', - google: '248170132962-5km115budk9h84raa26hdmnnqdj8ivkl.apps.googleusercontent.com' - }, { - redirect_uri: '/' - }); - //ensure login before state change $rootScope.$on('$stateChangeStart', function (event, toState, toParams) { if (!$rootScope.currentUser && Session.getLocalToken() != null && Session.getBackend()) { diff --git a/client/app/services/auth/login.service.js b/client/app/services/auth/login.service.js index 44fbd4e..b2f49a4 100644 --- a/client/app/services/auth/login.service.js +++ b/client/app/services/auth/login.service.js @@ -1,5 +1,5 @@ angular.module('dssWebApp') - .factory('LoginService', function ($rootScope, $http, $q, Session, UserModel, logger, + .factory('LoginService', function ($rootScope, $http, $q, $auth, Session, UserModel, logger, SERVER_CONFIG, STORAGE, AUTH_BACKENDS, AUTH_EVENTS) { return { @@ -10,32 +10,38 @@ angular.module('dssWebApp') }; function loginUser(provider) { - var defer = $q.defer(); - var backend = provider || Session.getBackend(); - hello(backend).login({force: false}).then(function (result) { - var response = hello.getAuthResponse(backend); - Session.setLocalToken(response.access_token); - getJwtToken(response.access_token, AUTH_BACKENDS[backend]) - .then(function (user) { - defer.resolve(user); - }).error(function (reason, code) { - defer.reject(reason, code); - }); - }, function (e) { - console.error(e); - defer.reject(e); - }); - return defer.promise; + var deferred = $q.defer(); + + var prov = provider || Session.getBackend(); + $auth.authenticate(prov) + .then(function () { + console.log('You have successfully signed in with ' + prov + '!'); + deferred.resolve(); + }) + .catch(function (error) { + if (error.error) { + // Popup error - invalid redirect_uri, pressed cancel button, etc. + console.error(error.error); + deferred.reject(error.error); + } else if (error.data) { + // HTTP response error from server + console.error(error.data.message, error.status); + deferred.reject(error.status); + } else { + console.error(error); + deferred.reject(error); + } + }); + return deferred.promise; } - function getJwtToken(helloToken, backend) { + function getJwtToken(token, backend) { var defer = $q.defer(); //need to clear any cached tokens before attempting login //otherwise server will 403 us Session.removeJwtToken(); - $http.post(SERVER_CONFIG.apiUrl + '/_login/', { - "access_token": helloToken, - "backend": backend + $http.post(SERVER_CONFIG.apiUrl + '/_login?backend?backend=' + backend , { + 'code': token }).success(function (response, status, headers, config) { if (response.token) { Session.setToken(response.token); @@ -43,10 +49,10 @@ angular.module('dssWebApp') Session.setBackend(backend); defer.resolve(backend); } else { - defer.reject("Invalid response token", 500); + defer.reject('Invalid response token', 500); } }).error(function (response, status, headers, config) { - defer.reject("Unable to retrieve access token", 500); + defer.reject('Unable to retrieve access token', 500); }); return defer.promise; } @@ -61,11 +67,11 @@ angular.module('dssWebApp') $rootScope.$broadcast(AUTH_EVENTS.loginSuccess, user); defer.resolve(user); }, function (result) { - defer.reject("Unable to get user object", 500); + defer.reject('Unable to get user object', 500); }) }).error(function (data, status, headers, config) { - defer.reject("Unable to get user proxy", 500); - }); + defer.reject('Unable to get user proxy', 500); + }); return defer.promise; } diff --git a/client/index.html b/client/index.html index c1c0ce0..d822013 100644 --- a/client/index.html +++ b/client/index.html @@ -123,6 +123,7 @@ + From 0ab088f80aa5e181a191a92a74ec9c3400960e94 Mon Sep 17 00:00:00 2001 From: Fergal Moran Date: Sun, 17 Jan 2016 21:13:23 +0000 Subject: [PATCH 2/3] Getting nowhere --- client/app/app.js | 17 ++++++++--------- client/app/services/auth/login.service.js | 4 ++-- 2 files changed, 10 insertions(+), 11 deletions(-) diff --git a/client/app/app.js b/client/app/app.js index 78f98ec..eaeae5e 100755 --- a/client/app/app.js +++ b/client/app/app.js @@ -31,13 +31,15 @@ angular.module('dssWebApp', [ //$httpProvider.defaults.headers.common.Accept = 'application/json'; $httpProvider.defaults.useXDomain = true; $httpProvider.interceptors.push('AuthInterceptor'); + $authProvider.baseUrl = SERVER_CONFIG.apiUrl + '/'; - $authProvider.loginUrl = '_login'; + $authProvider.loginUrl = '_a/'; $authProvider.authToken = 'JWT'; + $authProvider.loginRedirect = null; $authProvider.facebook({ name: 'facebook', - url: '/_login/?backend=facebook', + url: '/_a/?backend=facebook', clientId: '154504534677009', authorizationEndpoint: 'https://www.facebook.com/v2.5/dialog/oauth', redirectUri: window.location.origin + '/', @@ -49,8 +51,10 @@ angular.module('dssWebApp', [ popupOptions: {width: 580, height: 400} }); $authProvider.twitter({ - //qmvJ6tptgd8G9T9WYp6P3Q - url: '/_login?backend=twitter', + url: '_a/?backend=twitter' + }); + $authProvider.google({ + clientId: '248170132962-5km115budk9h84raa26hdmnnqdj8ivkl.apps.googleusercontent.com' }); ngClipProvider.setPath("bower_components/zeroclipboard/dist/ZeroClipboard.swf"); @@ -75,11 +79,6 @@ angular.module('dssWebApp', [ 'https://dsscdn.blob.core.windows.net/mixes/**' ]); $locationProvider.html5Mode(true); - - $authProvider.google({ - clientId: '248170132962-5km115budk9h84raa26hdmnnqdj8ivkl.apps.googleusercontent.com' - }); - }).run(function ($http, $rootScope, $state, $window, LoginService, Session, SocketService) { $rootScope.isPlaying = false; diff --git a/client/app/services/auth/login.service.js b/client/app/services/auth/login.service.js index b2f49a4..5a21f1c 100644 --- a/client/app/services/auth/login.service.js +++ b/client/app/services/auth/login.service.js @@ -13,7 +13,7 @@ angular.module('dssWebApp') var deferred = $q.defer(); var prov = provider || Session.getBackend(); - $auth.authenticate(prov) + $auth.authenticate(prov, {backend: prov}) .then(function () { console.log('You have successfully signed in with ' + prov + '!'); deferred.resolve(); @@ -40,7 +40,7 @@ angular.module('dssWebApp') //need to clear any cached tokens before attempting login //otherwise server will 403 us Session.removeJwtToken(); - $http.post(SERVER_CONFIG.apiUrl + '/_login?backend?backend=' + backend , { + $http.post(SERVER_CONFIG.apiUrl + '/_login/?backend?backend=' + backend , { 'code': token }).success(function (response, status, headers, config) { if (response.token) { From 6b4bb7b60103b75902602a4dffb9f1f4357649fb Mon Sep 17 00:00:00 2001 From: Fergal Moran Date: Tue, 26 Jan 2016 22:02:48 +0000 Subject: [PATCH 3/3] Feature finished --- client/app/app.js | 13 +- client/app/main.controller.js | 28 ++-- client/app/services/auth/auth.interceptor.js | 15 -- client/app/services/auth/httpInterceptor.js | 138 ------------------- client/app/services/auth/login.service.js | 9 +- client/index.html | 2 - 6 files changed, 23 insertions(+), 182 deletions(-) delete mode 100644 client/app/services/auth/auth.interceptor.js delete mode 100644 client/app/services/auth/httpInterceptor.js diff --git a/client/app/app.js b/client/app/app.js index eaeae5e..b436a1d 100755 --- a/client/app/app.js +++ b/client/app/app.js @@ -17,20 +17,19 @@ angular.module('dssWebApp', [ 'angulartics', 'ngClipboard', 'angular-jwt', - 'http-auth-interceptor', 'angular-smilies', 'satellizer', 'angulartics.google.analytics' ]) .config(function ($stateProvider, $sceDelegateProvider, $httpProvider, $urlRouterProvider, $locationProvider, $provide, $authProvider, - ngClipProvider, jwtInterceptorProvider, $analyticsProvider, dialogsProvider, DSProvider, DSHttpAdapterProvider, + ngClipProvider, $analyticsProvider, dialogsProvider, DSProvider, DSHttpAdapterProvider, SERVER_CONFIG, STORAGE) { $urlRouterProvider .otherwise('/'); //$httpProvider.defaults.headers.common.Accept = 'application/json'; $httpProvider.defaults.useXDomain = true; - $httpProvider.interceptors.push('AuthInterceptor'); + //$httpProvider.interceptors.push('AuthInterceptor'); $authProvider.baseUrl = SERVER_CONFIG.apiUrl + '/'; $authProvider.loginUrl = '_a/'; @@ -54,7 +53,9 @@ angular.module('dssWebApp', [ url: '_a/?backend=twitter' }); $authProvider.google({ - clientId: '248170132962-5km115budk9h84raa26hdmnnqdj8ivkl.apps.googleusercontent.com' + clientId: '248170132962-5km115budk9h84raa26hdmnnqdj8ivkl.apps.googleusercontent.com', + redirectUri: 'http://ext-test.deepsouthsounds.com:9000/', + url: '/_a/?backend=google', }); ngClipProvider.setPath("bower_components/zeroclipboard/dist/ZeroClipboard.swf"); @@ -105,6 +106,8 @@ angular.module('dssWebApp', [ //ensure login before state change $rootScope.$on('$stateChangeStart', function (event, toState, toParams) { + + /* if (!$rootScope.currentUser && Session.getLocalToken() != null && Session.getBackend()) { LoginService.loginUser().then(function (user) { LoginService.getUserProfile() @@ -130,6 +133,6 @@ angular.module('dssWebApp', [ } }); event.preventDefault(); - } + }*/ }); }); diff --git a/client/app/main.controller.js b/client/app/main.controller.js index 9770ac8..77ccb25 100755 --- a/client/app/main.controller.js +++ b/client/app/main.controller.js @@ -1,14 +1,24 @@ 'use strict'; angular.module('dssWebApp') - .controller('MainCtrl', function ($scope, $rootScope, $http, $state, dialogs, logger, authService, SocketService, AudioService, + .controller('MainCtrl', function ($scope, $rootScope, $http, $state, $auth, + dialogs, logger, SocketService, AudioService, MixModel, UserModel, LoginService, Session, SERVER_CONFIG, CHAT_EVENTS, AUTH_EVENTS) { $scope.isAuthorized = LoginService.isAuthorized; $scope.isAuthenticated = LoginService.isAuthenticated; $scope.currentPath = ''; $scope.chatVisible = false; $rootScope.isMessaging = false; - + $rootScope.$on('$stateChangeStart', function (event, toState, toParams) { + if ($auth.isAuthenticated()) { + LoginService.getUserProfile() + .then(function (user) { + $rootScope.setCurrentUser(user); + $rootScope.connectSockets(); + return $state.go(toState.name, toParams); + }); + } + }); $rootScope.safeApply = function (fn) { var phase = this.$root.$$phase; if (phase == '$apply' || phase == '$digest') { @@ -59,20 +69,6 @@ angular.module('dssWebApp') $rootScope.connectSockets(); }); - $scope.$on('event:auth-loginRequired', function (rejection) { - console.log("Refreshing token"); - LoginService.getJwtToken(Session.getLocalToken(), Session.getBackend()) - .then(function (result) { - authService.loginConfirmed(result, function (config) { - config.headers = config.headers || {}; - config.headers.Authorization = 'JWT ' + Session.getToken(); - return config; - }); - }, function (reason, code) { - console.error(reason, code); - }); - }); - $scope.setCurrentPath = function (path) { $scope.currentPath = path; }; diff --git a/client/app/services/auth/auth.interceptor.js b/client/app/services/auth/auth.interceptor.js deleted file mode 100644 index a34d0b0..0000000 --- a/client/app/services/auth/auth.interceptor.js +++ /dev/null @@ -1,15 +0,0 @@ -'use strict'; -angular.module('dssWebApp') - .factory('AuthInterceptor', function ($q, jwtHelper, Session) { - return { - request: addToken - }; - function addToken(config) { - var token = Session.getToken(); - if (token) { - config.headers = config.headers || {}; - config.headers.Authorization = 'JWT ' + token; - } - return config; - } - }); diff --git a/client/app/services/auth/httpInterceptor.js b/client/app/services/auth/httpInterceptor.js deleted file mode 100644 index fb59a56..0000000 --- a/client/app/services/auth/httpInterceptor.js +++ /dev/null @@ -1,138 +0,0 @@ -/*global angular:true, browser:true */ - -/** - * @license HTTP Auth Interceptor Module for AngularJS - * (c) 2012 Witold Szczerba - * License: MIT - */ -(function () { - 'use strict'; - - angular.module('http-auth-interceptor', ['http-auth-interceptor-buffer']) - - .factory('authService', ['$rootScope', 'httpBuffer', function ($rootScope, httpBuffer) { - return { - /** - * Call this function to indicate that authentication was successfull and trigger a - * retry of all deferred requests. - * @param data an optional argument to pass on to $broadcast which may be useful for - * example if you need to pass through details of the user that was logged in - */ - loginConfirmed: function (data, configUpdater) { - var updater = configUpdater || function (config) { - return config; - }; - $rootScope.$broadcast('event:auth-loginConfirmed', data); - httpBuffer.retryAll(updater); - }, - - /** - * Call this function to indicate that authentication should not proceed. - * All deferred requests will be abandoned or rejected (if reason is provided). - * @param data an optional argument to pass on to $broadcast. - * @param reason if provided, the requests are rejected; abandoned otherwise. - */ - loginCancelled: function (data, reason) { - httpBuffer.rejectAll(reason); - $rootScope.$broadcast('event:auth-loginCancelled', data); - }, - - /** - * Call this function to make a function onto every object in the httpBuffer - * This allows us to modify the requests - */ - transformRequests: function (func) { - httpBuffer.transform(func); - } - }; - }]) - - /** - * $http interceptor. - * On 401 response (without 'ignoreAuthModule' option) stores the request - * and broadcasts 'event:angular-auth-loginRequired'. - */ - .config(['$httpProvider', function ($httpProvider) { - $httpProvider.interceptors.push(['$rootScope', '$q', 'httpBuffer', function ($rootScope, $q, httpBuffer) { - return { - responseError: function (rejection) { - if ((rejection.status === 401 || rejection.status === 403) && !rejection.config.ignoreAuthModule) { - var deferred = $q.defer(); - httpBuffer.append(rejection.config, deferred); - $rootScope.$broadcast('event:auth-loginRequired', rejection); - return deferred.promise; - } - // otherwise, default behaviour - return $q.reject(rejection); - } - }; - }]); - }]); - - /** - * Private module, a utility, required internally by 'http-auth-interceptor'. - */ - angular.module('http-auth-interceptor-buffer', []) - - .factory('httpBuffer', ['$injector', function ($injector) { - /** Holds all the requests, so they can be re-requested in future. */ - var buffer = []; - - /** Service initialized later because of circular dependency problem. */ - var $http; - - function retryHttpRequest(config, deferred) { - function successCallback(response) { - deferred.resolve(response); - } - - function errorCallback(response) { - deferred.reject(response); - } - - $http = $http || $injector.get('$http'); - $http(config).then(successCallback, errorCallback); - } - - return { - /** - * Appends HTTP request configuration object with deferred response attached to buffer. - */ - append: function (config, deferred) { - buffer.push({ - config: config, - deferred: deferred - }); - }, - - /** - * Apply a function to every call in the buffer array - */ - transform: function (func) { - buffer = buffer.map(func); - }, - - /** - * Abandon or reject (if reason provided) all the buffered requests. - */ - rejectAll: function (reason) { - if (reason) { - for (var i = 0; i < buffer.length; ++i) { - buffer[i].deferred.reject(reason); - } - } - buffer = []; - }, - - /** - * Retries all the buffered requests clears the buffer. - */ - retryAll: function (updater) { - for (var i = 0; i < buffer.length; ++i) { - retryHttpRequest(updater(buffer[i].config), buffer[i].deferred); - } - buffer = []; - } - }; - }]); -})(); diff --git a/client/app/services/auth/login.service.js b/client/app/services/auth/login.service.js index 5a21f1c..3c8ecdb 100644 --- a/client/app/services/auth/login.service.js +++ b/client/app/services/auth/login.service.js @@ -77,14 +77,11 @@ angular.module('dssWebApp') function logoutUser() { var defer = $q.defer(); - hello.logout(Session.getBackend()) - .then(function () { - Session.destroy(); - defer.resolve(); - }, function () { - Session.destroy(); + $auth.logout() + .then(function(){ defer.resolve(); }); + return defer.promise; } }); diff --git a/client/index.html b/client/index.html index d822013..29c39d7 100644 --- a/client/index.html +++ b/client/index.html @@ -193,8 +193,6 @@ - -