Basic GitHub login via OAuth

This commit is contained in:
Ian Prest 2015-08-01 22:32:26 -04:00
parent 44ab242e1a
commit b7f42d5177
5 changed files with 85 additions and 3 deletions

View file

@ -64,6 +64,7 @@ $(call BOWER,bower_components/jquery/jquery.min.js)
$(call BOWER,bower_components/angular/angular.min.js)
$(call BOWER,bower_components/angular-bootstrap-colorpicker/css/colorpicker.min.css)
$(call BOWER,bower_components/angular-sanitize/angular-sanitize.min.js)
$(call BOWER,bower_components/angular-cookies/angular-cookies.min.js)
$(call BOWER,bower_components/angular-ui-utils/components/angular-ui-docs/build/ui-utils.min.js)
$(call BOWER,bower_components/ng-file-upload/ng-file-upload.min.js)
$(call BOWER,bower_components/angular-native-dragdrop/draganddrop.js)

View file

@ -41,6 +41,7 @@
"ng-file-upload": "5.0.9",
"angular-ui-bootstrap": "0.12.0",
"fontawesome": "4.3.0",
"hint.css": "1.3.5"
"hint.css": "1.3.5",
"angular-cookies": "1.2.28"
}
}

View file

@ -16,6 +16,7 @@ All rights reserved.
<script type="text/javascript" src="js/jquery.min.js"></script>
<script type="text/javascript" src="js/angular.min.js"></script>
<script type="text/javascript" src="js/angular-sanitize.min.js"></script>
<script type="text/javascript" src="js/angular-cookies.min.js"></script>
<script type="text/javascript" src="js/ui-utils.min.js"></script>
<script type="text/javascript" src="js/ui-bootstrap-tpls-0.12.0.min.js"></script>
<script type="text/javascript" src="js/crypto-js.js"></script>
@ -100,6 +101,8 @@ Nav Bar / Header
<li><a href="#" ng-click="showOptions()"><i class="fa fa-cog"></i> Options</a></li>
<!-- Permalink button -->
<li><a ng-href="{{getPermalink()}}" target="_blank" ng-click="dirty = false"><i class="fa fa-link"></i> Permalink</a></li>
<!-- User button -->
<li><a href="#" ng-click="userLogin()" ng-hide="oauthToken"><i class="fa fa-github"></i> Sign in with GitHub</a></li>
</ul>
</div>
</nav>
@ -609,6 +612,9 @@ Nav Bar / Header
<alert type="danger" ng-hide="!loadError" close="loadError=false" ng-cloak>
The requested layout does not exist.
</alert>
<alert type="danger" ng-hide="!oauthError" close="oauthError=null" ng-cloak>
An error occurred during login: {{oauthError}}
</alert>
</div>
</div>

36
kb.js
View file

@ -11,13 +11,13 @@
function fromJsonPretty(json) { return $serial.fromJsonL('['+json+']'); }
// The angular module for our application
var kbApp = angular.module('kbApp', ["ngSanitize", "ui.utils", "ui.bootstrap", "ui.bootstrap.tooltip", "ngFileUpload", "ang-drag-drop", "colorpicker.module"], function($tooltipProvider) {
var kbApp = angular.module('kbApp', ["ngSanitize", "ngCookies", "ui.utils", "ui.bootstrap", "ui.bootstrap.tooltip", "ngFileUpload", "ang-drag-drop", "colorpicker.module"], function($tooltipProvider) {
// Default tooltip behaviour
$tooltipProvider.options({animation: false, appendToBody: true});
});
// The main application controller
kbApp.controller('kbCtrl', ['$scope','$http','$location','$timeout', '$sce', '$sanitize', '$modal', function($scope, $http, $location, $timeout, $sce, $sanitize, $modal) {
kbApp.controller('kbCtrl', ['$scope','$http','$location','$timeout', '$sce', '$sanitize', '$modal', '$cookies', function($scope, $http, $location, $timeout, $sce, $sanitize, $modal, $cookies) {
var serializedTimer = false;
var customStylesTimer = false;
@ -1073,6 +1073,38 @@
$scope.keyboardTop = function() { var kbElem = $("#keyboard"); return kbElem.position().top + parseInt(kbElem.css('margin-top'),10); };
$scope.keyboardLeft = function() { var kbElem = $("#keyboard"); return kbElem.position().left + parseInt(kbElem.css('margin-left'),10); };
var userLoginSecret;
$scope.oauthToken = $cookies.oauthToken;
$scope.userLogin = function() {
if(!userLoginSecret && !$scope.oauthToken) {
$scope.oauthToken = null;
var parms = "&client_id=631d93caeaa61c9057ab&redirect_uri=http://localhost:8080/oauth.html";
userLoginSecret = (window.performance && window.performance.now ? window.performance.now() : Date.now()).toString() + "_" + (Math.random()).toString();
var loginWindow = window.open("https://github.com/login/oauth/authorize?scope=gist&state="+userLoginSecret+parms,
"Sign in with Github", "left="+(window.left+50)+",top="+(window.top+50)+",width=1050,height=630,personalbar=0,toolbar=0,scrollbars=1,resizable=1");
if(loginWindow) {
loginWindow.focus();
}
}
};
$scope.oauthError = null;
window.__oauthError = function(error) {
userLoginSecret = null;
$scope.oauthError = error || 'Unknown error.';
$scope.oauthToken = null;
};
window.__oauthSuccess = function(code, secret) {
if(secret !== userLoginSecret) {
window.__oauthError('The server returned an incorrect login secret.');
} else {
userLoginSecret = null;
$scope.oauthToken = code;
$cookies.oauthToken = $scope.oauthToken;
}
};
}]);
// Simple modal-popup controller

42
oauth.html Normal file
View file

@ -0,0 +1,42 @@
<!--***********************************************
KEYBOARD LAYOUT EDITOR
Copyright (C) 2013-2015 Ian Prest
All rights reserved.
************************************************-->
<!DOCTYPE html>
<html>
<head>
<title>Keyboard Layout Editor</title>
<meta charset="utf-8">
<script type="text/javascript" src="js/jquery.min.js"></script>
</head>
<body>
<script type="text/javascript">
if(!window.opener) {
window.close();
}
var code = (window.location.href.match(/[\?\&]code=([^\&]*)/) || [null])[1];
var state = (window.location.href.match(/[\?\&]state=([^\&]*)/) || [null])[1];
if(code && state) {
$.getJSON('http://kle-gatekeeper.azurewebsites.net/authenticate/'+code, function(data) {
if(data.error) {
window.opener.__oauthError('Gatekeeper returned an error code: ' + data.error);
} else if(!data.token) {
window.opener.__oauthError('Gatekeeper did not return an OAuth token.');
} else {
window.opener.__oauthSuccess(code, state);
}
window.close();
}).fail(function() {
window.opener.__oauthError('Could not communicate with the gatekeeper process.');
window.close();
});
} else {
window.opener.__oauthError('Redirect called with incorrect parameters.');
window.close();
}
</script>
</body>
</html>