diff --git a/app/extensions/oauth/services/oauth-service.js b/app/extensions/oauth/services/oauth-service.js deleted file mode 100644 index 88221dd5b..000000000 --- a/app/extensions/oauth/services/oauth-service.js +++ /dev/null @@ -1,41 +0,0 @@ -angular.module('portainer.extensions.oauth').service('OAuthService', [ - 'API_ENDPOINT_OAUTH', 'OAuth', 'urlHelper', 'Notifications', - function OAuthService(API_ENDPOINT_OAUTH, OAuth, urlHelper, Notifications) { - this.login = login; - - function login() { - var loginUrl = API_ENDPOINT_OAUTH + '/login'; - var popup = window.open(loginUrl, 'login-popup', 'width=800, height=600'); - if (!popup) { - Notifications.warn('Please enable popups for this page'); - } - return waitForCode(popup).then(function onCodeReady(code) { - return OAuth.validate({ code: code }).$promise; - }); - } - - function waitForCode(popup) { - return waitFor(function checkIfCodeIsAvailable() { - if (popup.document.URL.indexOf('code') !== -1) { - var queryParams = popup.location.search; - popup.close(); - return urlHelper.getParameter(queryParams, 'code'); - } - }); - } - - function waitFor(clbk, interval) { - interval = interval || 100; - var intervalId; - return new Promise(function executor(resolve) { - intervalId = setInterval(function intervalFunction() { - var callbackReturn = clbk(); - if (callbackReturn) { - clearInterval(intervalId); - resolve(callbackReturn); - } - }, interval); - }); - } - }, -]); diff --git a/app/portainer/helpers/urlHelper.js b/app/portainer/helpers/urlHelper.js index daacf0131..3125492a5 100644 --- a/app/portainer/helpers/urlHelper.js +++ b/app/portainer/helpers/urlHelper.js @@ -2,13 +2,13 @@ angular.module('portainer.app').service('urlHelper', function urlHelper($window) this.getParameter = getParameter; this.cleanParameters = cleanParameters; - function getParameter(queryParams, param) { - var parameters = extractParameters(queryParams); + function getParameter(param) { + var parameters = extractParameters(); return parameters[param]; } - function extractParameters(queryParams) { - var queryString = queryParams.replace(/.*?\?/,'').split('&'); + function extractParameters() { + var queryString = $window.location.search.replace(/.*?\?/,'').split('&'); return queryString.reduce(function(acc, keyValStr) { var keyVal = keyValStr.split('='); var key = keyVal[0]; diff --git a/app/portainer/services/authentication.js b/app/portainer/services/authentication.js index ac03e1fde..39b7ada24 100644 --- a/app/portainer/services/authentication.js +++ b/app/portainer/services/authentication.js @@ -1,7 +1,7 @@ angular.module('portainer.app') .factory('Authentication', [ -'Auth', 'OAuthService', 'jwtHelper', 'LocalStorage', 'StateManager', 'EndpointProvider', -function AuthenticationFactory(Auth, OAuthService, jwtHelper, LocalStorage, StateManager, EndpointProvider) { +'Auth', 'OAuth', 'jwtHelper', 'LocalStorage', 'StateManager', 'EndpointProvider', +function AuthenticationFactory(Auth, OAuth, jwtHelper, LocalStorage, StateManager, EndpointProvider) { 'use strict'; var service = {}; @@ -13,8 +13,6 @@ function AuthenticationFactory(Auth, OAuthService, jwtHelper, LocalStorage, Stat service.logout = logout; service.isAuthenticated = isAuthenticated; service.getUserDetails = getUserDetails; - - function init() { var jwt = LocalStorage.getJWT(); @@ -24,10 +22,10 @@ function AuthenticationFactory(Auth, OAuthService, jwtHelper, LocalStorage, Stat } } - function OAuthLogin() { - return OAuthService.login() - .then(function onLoginSuccess(loginResponse) { - setUser(loginResponse.jwt); + function OAuthLogin(code) { + return OAuth.login({ code: code }).$promise + .then(function onLoginSuccess(response) { + return setUser(response.jwt); }); } diff --git a/app/portainer/views/auth/auth.html b/app/portainer/views/auth/auth.html index e32b7633a..62c26d8b6 100644 --- a/app/portainer/views/auth/auth.html +++ b/app/portainer/views/auth/auth.html @@ -28,9 +28,11 @@
- + +
+ Login with OAuth +
+
diff --git a/app/portainer/views/auth/authController.js b/app/portainer/views/auth/authController.js index 575ecdc6a..fb8968e48 100644 --- a/app/portainer/views/auth/authController.js +++ b/app/portainer/views/auth/authController.js @@ -1,6 +1,6 @@ angular.module('portainer.app') -.controller('AuthenticationController', ['$q', '$scope', '$state', '$stateParams', '$sanitize', 'Authentication', 'UserService', 'EndpointService', 'StateManager', 'Notifications', 'SettingsService', -function ($q, $scope, $state, $stateParams, $sanitize, Authentication, UserService, EndpointService, StateManager, Notifications, SettingsService) { +.controller('AuthenticationController', ['urlHelper','$q', '$scope', '$state', '$stateParams', '$sanitize', 'Authentication', 'UserService', 'EndpointService', 'StateManager', 'Notifications', 'SettingsService', +function (urlHelper, $q, $scope, $state, $stateParams, $sanitize, Authentication, UserService, EndpointService, StateManager, Notifications, SettingsService) { $scope.logo = StateManager.getState().application.logo; $scope.formValues = { @@ -37,17 +37,6 @@ function ($q, $scope, $state, $stateParams, $sanitize, Authentication, UserServi }); }; - $scope.oauthLogin = function oauthLogin() { - return Authentication.OAuthLogin() - .then(function onLoginSuccess() { - return $state.go('portainer.home'); - }) - .catch(function onError(error) { - $scope.state.AuthenticationError = error.message; - }); - }; - - function unauthenticatedFlow() { EndpointService.endpoints() .then(function success(endpoints) { @@ -115,10 +104,23 @@ function ($q, $scope, $state, $stateParams, $sanitize, Authentication, UserServi authenticatedFlow(); } - + var code = urlHelper.getParameter('code'); + if (code) { + oAuthLogin(code); + } + } + + function oAuthLogin(code) { + return Authentication.OAuthLogin(code) + .then(function success() { + urlHelper.cleanParameters(); + $state.go('portainer.home'); + }) + .catch(function error() { + $scope.state.AuthenticationError = 'Failed to authenticate with OAuth2 Provider'; + }); } - initView(); }]);