diff --git a/client/index.html b/client/index.html index 6781c9a..dc05879 100644 --- a/client/index.html +++ b/client/index.html @@ -11,7 +11,14 @@
User: {{ user.firstName }} {{ user.lastName }}
diff --git a/client/js/config.js b/client/js/config.js index b979844..e701401 100644 --- a/client/js/config.js +++ b/client/js/config.js @@ -6,7 +6,7 @@ angular.module('Percero.Config', [], function($provide) { gatewayPort: "8080", // The OAuth provider used for authentication oauthProviders: { - "Google": { + "googleoauth": { redirectUri: "http://localhost:8081/oauth2callback.html", appKey: "426306336879-m3ffk6mqt63pot5pg1kq52b7rmf2lnfo.apps.googleusercontent.com", displayName: "Google" diff --git a/client/js/controller.js b/client/js/controller.js index c4ebd0d..4ab46e3 100644 --- a/client/js/controller.js +++ b/client/js/controller.js @@ -6,42 +6,86 @@ app.controller('HelloWorldCtrl', function ($scope, percero) { $scope.authenticated = false; $scope.percero = percero; - $scope.login = function(){ - percero.api.authenticate('Google') + $scope.anonLogin = function(){ + percero.api.authenticateAnonymously() .then( - function(userToken){ - console.log("onLoginResult"); - if(!userToken){ - console.log("token falsey") - }else{ - /** - * Successful auth... now pull down the person object so - * we know who we are - */ - console.log("OAuth Success!") - $scope.authenticated = true; - - /** - * Now do a lookup for our user object - */ - var example = new percero.domain.User(); - example.userId = userToken.user.ID; - percero.api.findByExample(example, function(message) { - var user = message.result[0]; - $scope.$apply(function(){ - // This also gets hit when the server sends down a person object - $scope.user = user; - console.log(user); - }); - }); - } + onLoginComplete, + function(error){ + console.log(error); }, + function(progress) { + console.log(progress); + }); + }; + + $scope.cookieLogin = function(){ + percero.api.authenticateFromCookie() + .then( + onLoginComplete, function(error){ console.log(error); }, function(progress) { console.log(progress); }); + + }; + + $scope.googleLogin = function(){ + percero.api.authenticateWithOAuth('googleoauth') + .then( + onLoginComplete, + function(error){ + console.log(error); + }, + function(progress) { + console.log(progress); + }); + + }; + + $scope.creds = {} + $scope.userPassLogin = function(){ + percero.api.authenticateWithUserPass($scope.creds.username, $scope.creds.password, 'jsonfile') + .then( + onLoginComplete, + function(error){ + console.log(error); + }, + function(progress) { + console.log(progress); + }); + + }; + + function onLoginComplete(userToken){ + console.log("onLoginResult"); + if(!userToken){ + console.log("token falsey") + }else{ + /** + * Successful auth... now pull down the person object so + * we know who we are + */ + console.log("Auth Success!") + $scope.authenticated = true; + + /** + * Now do a lookup for our user object + */ + var example = new percero.domain.User(); + example.userId = userToken.user.ID; + console.log("UserID: "+userToken.user.ID); + percero.api.findByExample(example, function(message) { + console.log(message); + $scope.user = message.result[0]; + //$scope.$apply(function(){ + // // This also gets hit when the server sends down a person object + // $scope.user = user; + // console.log(user); + //}); + }); + } } $scope.percero = percero; diff --git a/client/js/model/User.js b/client/js/model/User.js index 239cf4e..d3c9d90 100644 --- a/client/js/model/User.js +++ b/client/js/model/User.js @@ -191,7 +191,7 @@ angular.module('HelloWorld.Domain.User', } ,doLoad: function(){ - if (this.isShell && !this.isLoading) { + if (this.isShell && !this.isLoading && this.ID) { this.isLoading = true; var that = this; this.api.findById(this.cn, this.ID, function() { diff --git a/client/lib/activestack/PerceroApi.js b/client/lib/activestack/PerceroApi.js index 276689e..d2d84b3 100644 --- a/client/lib/activestack/PerceroApi.js +++ b/client/lib/activestack/PerceroApi.js @@ -17,29 +17,209 @@ angular.module('Percero.Api', ['Percero.Model','Percero.Client','Percero.Config' // Need to inject the API service into the domain classes because they use it directly PerceroDomain.init(this); + this.authenticateFromCookie = function(){ + var deferred = autoLoginDeferred = Q.defer(); + + autoLoginTimeout = setTimeout(function(){ + if(autoLoginDeferred) { + autoLoginDeferred.reject(new Error("Login Timed Out")); + autoLoginDeferred = null; + autoLoginUT = null; + autoLoginTimeout = null; + } + },45000); + + userToken = this.getCookie('userToken'); + // if we have a userToken and it is valid + if(userToken && userToken.clientId && userToken.token && userToken.user && userToken.user.ID){ + // This will create connect to the server, and when it has established the connection will call our callback + // Which will try to autologin + deferred.notify(1); + self.connect() + .then(function(){ + deferred.notify(2); + var request = {}; + request.cn = "com.percero.agents.auth.vo.ReauthenticationRequest"; + request.regAppKey = ""; + request.clientId = userToken.clientId; + request.token = userToken.token; + request.userId = userToken.user.ID; + request.deviceId = userToken.deviceId; + + console.log("Request") + console.log(request); + client.sendRequest("reauthenticate", request, function(message){ + console.log(message); + autoLoginUT = message.result; + deferred.notify(3); + +// deferred.resolve(message.result); + }); + }, function(err){ + deferred.reject(err); + }); + } + else{ + deferred.reject(new Error("No userToken cookie found")); + } + + return deferred.promise; + }; + + this.authenticateWithUserPass = function(username,password,providerId){ + var deferred = Q.defer(); + + this.connect() + .then(function () { + $log.info("Client connected"); + self.loginWithUserPass(username, password, providerId) + .then( + function (success) { + deferred.resolve(success); + }, + function (error) { + deferred.reject(error); + }); + }, function (error) { + deferred.reject(error); + }); + + return deferred.promise; + }; + + this.loginWithUserPass = function(username, password, providerId){ + console.log("LoginWithUserPass called"); + var deferred = loginDeferred = Q.defer(); + loginTimeout = setTimeout(function(){ + if(loginDeferred) { + loginDeferred.reject(new Error("Login Timed Out")); + loginDeferred = null; + loginUT = null; + loginTimeout = null; + } + },45000); + var request = {}; + request.cn = "com.percero.agents.auth.vo.AuthenticationRequest"; + request.deviceId = deviceId; + request.authProvider = providerId; + request.credential = username+":"+password; + + $log.info('Senging AuthenticationRequest'); + client.sendRequest("authenticate", request, function(message) { + console.log("Got authenticate response"); + if(deferred) { + deferred.notify(1); + } + + // Store the userToken in the cookie for later + $log.info('authenticateOAuthCode message:'); + $log.info(message); + if(message.result) { + userToken = message.result; - this.authenticate = function(providerId){ + $log.info('Saving userToken as cookie'); + self.setCookie('userToken', userToken); + /** + * TODO: This only seems to break things? Is this really needed? + */ + client.setCommonParams({token: message.result.token, + userId: message.result.user.ID, + deviceId: message.result.deviceId, + sendAck: true}); + + + loginUT = userToken; + } + else + deferred.resolve(false); + }); + + return deferred.promise; + }; + + this.authenticateAnonymously = function(){ + var deferred = Q.defer(); + + this.connect() + .then(function () { + $log.info("Client connected"); + self.loginAnonymously() + .then( + function (success) { + deferred.resolve(success); + }, + function (error) { + deferred.reject(error); + }); + }, function (error) { + deferred.reject(error); + }); + + return deferred.promise; + }; + + this.loginAnonymously = function(){ + console.log("LoginAnonymously called"); + var deferred = loginDeferred = Q.defer(); + loginTimeout = setTimeout(function(){ + if(loginDeferred) { + loginDeferred.reject(new Error("Login Timed Out")); + loginDeferred = null; + loginUT = null; + loginTimeout = null; + } + },45000); + var request = {}; + request.cn = "com.percero.agents.auth.vo.AuthenticationRequest"; + request.deviceId = deviceId; + request.authProvider = 'anonymous'; + $log.info('Senging AuthenticationRequest'); + client.sendRequest("authenticate", request, function(message) { + console.log("Got authenticate response"); + if(deferred) { + deferred.notify(1); + } + + // Store the userToken in the cookie for later + $log.info('authenticateOAuthCode message:'); + $log.info(message); + if(message.result) { + userToken = message.result; + + $log.info('Saving userToken as cookie'); + self.setCookie('userToken', userToken); + /** + * TODO: This only seems to break things? Is this really needed? + */ + client.setCommonParams({token: message.result.token, + userId: message.result.user.ID, + deviceId: message.result.deviceId, + sendAck: true}); + + + loginUT = userToken; + } + else + deferred.resolve(false); + }); + + return deferred.promise; + }; + + this.authenticateWithOAuth = function(providerId){ var deferred = Q.defer(); var progress = 0; var stateId = Math.random() * 1000000 + ""; // Required by some OAuth providers to be included in the original request. var oauthProvider = undefined; - // If providerId is not defined or doesn't exist, attempt to find default. - if (!providerId || !PerceroConfig.oauthProviders.hasOwnProperty(providerId)) { - providerId = PerceroConfig.oauthProvider; - } - // Get the selected oauthProvider, if it exists. If it does NOT exist then // attempt to grab the default values for oauth. if (providerId && PerceroConfig.oauthProviders.hasOwnProperty(providerId)) { oauthProvider = PerceroConfig.oauthProviders[providerId]; } else { - oauthProvider = { - appKey: PerceroConfig.appKey, - redirectUri: PerceroConfig.redirectUri - } + throw new Error('OAuth provider: '+providerId+' not configured'); } $log.debug('OAuth Provider: ' + providerId); @@ -48,7 +228,7 @@ angular.module('Percero.Api', ['Percero.Model','Percero.Client','Percero.Config' this.currentOauthProvider = oauthProvider; this.currentOauthProviderId = providerId; - if (providerId.toUpperCase() == "GOOGLE") { + if (providerId.toUpperCase() == "GOOGLEOAUTH" || providerId.toUpperCase() == "GOOGLE") { var uri = "https://accounts.google.com/o/oauth2/auth?client_id=" + oauthProvider.appKey + "&access_type=offline&redirect_uri=" + oauthProvider.redirectUri + "&response_type=code&" + @@ -93,7 +273,7 @@ angular.module('Percero.Api', ['Percero.Model','Percero.Client','Percero.Config' self.connect() .then(function () { deferred.notify(++progress); - self.login() + self.loginOAuth() .then( function (success) { deferred.resolve(success); @@ -123,7 +303,7 @@ angular.module('Percero.Api', ['Percero.Model','Percero.Client','Percero.Config' var loginDeferred = null; var loginUT = null; var loginTimeout = null; - this.login = function() { + this.loginOAuth = function() { var deferred = loginDeferred = Q.defer(); loginTimeout = setTimeout(function(){ if(loginDeferred) { @@ -134,16 +314,14 @@ angular.module('Percero.Api', ['Percero.Model','Percero.Client','Percero.Config' } },45000); var request = {}; - request.cn = "com.percero.agents.auth.vo.AuthenticateOAuthCodeRequest"; - request.regAppKey = ""; - request.code = oauthCode; - request.redirectUri = this.currentOauthProvider.redirectUri; - request.deviceId = deviceId; - request.requestToken = ""; - request.requestSecret = ""; - request.authProvider = this.currentOauthProviderId.toUpperCase(); + request.cn = "com.percero.agents.auth.vo.AuthenticationRequest"; + request.credential = JSON.stringify({ + code: oauthCode, + redirectUrl: this.currentOauthProvider.redirectUri + }); + request.authProvider = this.currentOauthProviderId; $log.info('Senging authenticateOAuthCode request'); - client.sendRequest("authenticateOAuthCode", request, function(message) { + client.sendRequest("authenticate", request, function(message) { if(deferred) { deferred.notify(1); } @@ -151,9 +329,8 @@ angular.module('Percero.Api', ['Percero.Model','Percero.Client','Percero.Config' // Store the userToken in the cookie for later $log.info('authenticateOAuthCode message:'); $log.info(message); - if(message.result && message.accessToken) { + if(message.result) { userToken = message.result; - userToken.accessToken = message.accessToken; $log.info('Saving userToken as cookie'); self.setCookie('userToken', userToken); /** @@ -164,10 +341,7 @@ angular.module('Percero.Api', ['Percero.Model','Percero.Client','Percero.Config' deviceId: message.result.deviceId, sendAck: true}); - -// deferred.resolve(userToken); loginUT = userToken; -// deferred.resolve(false); } else deferred.resolve(false); diff --git a/worker/src/main/resources/auth/users.json b/worker/src/main/resources/auth/users.json new file mode 100644 index 0000000..b3198c7 --- /dev/null +++ b/worker/src/main/resources/auth/users.json @@ -0,0 +1,14 @@ +[ + { + "firstName":"Jonathan", + "lastName":"Samples", + "email":"jonathan@mail.com", + "passHash":"3da541559918a808c2402bba5012f6c60b27661c" + }, + { + "firstName":"Collin", + "lastName":"Brown", + "email":"collin@mail.com", + "passHash":"1161e6ffd3637b302a5cd74076283a7bd1fc20d3" + } +] \ No newline at end of file diff --git a/worker/src/main/resources/properties/env.properties b/worker/src/main/resources/properties/env.properties index 30ad8fe..0fe5d0d 100644 --- a/worker/src/main/resources/properties/env.properties +++ b/worker/src/main/resources/properties/env.properties @@ -54,4 +54,8 @@ oauth.google.clientSecret=HPH9s_dgj1pLNn4VcB5ZFxre oauth.google.domain= oauth.google.admin=jonnysamps@gmail.com oauth.google.webCallbackUrl=http://localhost:8081/oauth2callback.html -oauth.google.application_name="Hello World ActiveStack" \ No newline at end of file +oauth.google.application_name="Hello World ActiveStack" + +# FileAuth +fileAuth.fileLocation=src/main/resources/auth/users.json +fileAuth.providerID=jsonfile \ No newline at end of file