139 lines
4 KiB
JavaScript
139 lines
4 KiB
JavaScript
window.keycloak = (function () {
|
|
var kc = {};
|
|
var config = {
|
|
clientId: null,
|
|
clientSecret: null
|
|
};
|
|
|
|
kc.init = function (c) {
|
|
for (var prop in config) {
|
|
if (c[prop]) {
|
|
config[prop] = c[prop];
|
|
}
|
|
|
|
if (!config[prop]) {
|
|
throw new Error(prop + ' not defined');
|
|
}
|
|
}
|
|
|
|
loadToken();
|
|
|
|
if (kc.token) {
|
|
kc.user = kc.tokenInfo.user_id;
|
|
kc.authenticated = true;
|
|
} else {
|
|
kc.authenticated = false;
|
|
kc.user = null;
|
|
}
|
|
}
|
|
|
|
kc.login = function () {
|
|
var clientId = encodeURIComponent(config.clientId);
|
|
var redirectUri = encodeURIComponent(window.location.href);
|
|
var state = encodeURIComponent(createUUID());
|
|
var scope = encodeURIComponent('https://www.googleapis.com/auth/userinfo.profile https://www.googleapis.com/auth/plus.login');
|
|
var url = 'https://accounts.google.com/o/oauth2/auth?response_type=token&client_id=' + clientId + '&redirect_uri=' + redirectUri
|
|
+ '&state=' + state + '&scope=' + scope;
|
|
|
|
sessionStorage.state = state;
|
|
|
|
window.location.href = url;
|
|
}
|
|
|
|
function parseToken(token) {
|
|
return JSON.parse(atob(token.split('.')[1]));
|
|
}
|
|
|
|
kc.profile = function(header) {
|
|
var url = 'https://www.googleapis.com/oauth2/v1/userinfo'
|
|
|
|
if (!header) {
|
|
url = url + '?access_token=' + kc.token;
|
|
}
|
|
|
|
var http = new XMLHttpRequest();
|
|
http.open('GET', url, false);
|
|
if (header) {
|
|
http.setRequestHeader('Authorization', 'Bearer ' + kc.token);
|
|
}
|
|
|
|
http.send();
|
|
if (http.status == 200) {
|
|
return JSON.parse(http.responseText);
|
|
}
|
|
}
|
|
|
|
kc.contacts = function(header) {
|
|
var url = 'https://www.googleapis.com/plus/v1/people/me';
|
|
|
|
if (!header) {
|
|
url = url + '?access_token=' + kc.token;
|
|
}
|
|
|
|
var http = new XMLHttpRequest();
|
|
http.open('GET', url, false);
|
|
if (header) {
|
|
http.setRequestHeader('Authorization', 'Bearer ' + kc.token);
|
|
}
|
|
|
|
http.send();
|
|
if (http.status == 200) {
|
|
return http.responseText;
|
|
}
|
|
}
|
|
|
|
return kc;
|
|
|
|
function loadToken() {
|
|
var params = {}
|
|
var queryString = location.hash.substring(1)
|
|
var regex = /([^&=]+)=([^&]*)/g, m;
|
|
while (m = regex.exec(queryString)) {
|
|
params[decodeURIComponent(m[1])] = decodeURIComponent(m[2]);
|
|
}
|
|
|
|
var token = params['access_token'];
|
|
var state = params['state'];
|
|
|
|
if (token && state === sessionStorage.state) {
|
|
window.history.replaceState({}, document.title, location.protocol + "//" + location.host + location.pathname);
|
|
|
|
kc.token = token;
|
|
|
|
var url = 'https://www.googleapis.com/oauth2/v1/tokeninfo?access_token=' + token;
|
|
|
|
var http = new XMLHttpRequest();
|
|
http.open('GET', url, false);
|
|
|
|
http.send();
|
|
if (http.status == 200) {
|
|
kc.tokenInfo = JSON.parse(http.responseText);
|
|
}
|
|
}
|
|
return undefined;
|
|
}
|
|
|
|
function getQueryParam(name) {
|
|
console.debug(window.location.hash);
|
|
var params = window.location.hash.substring(1).split('&');
|
|
for (var i = 0; i < params.length; i++) {
|
|
var p = params[i].split('=');
|
|
if (decodeURIComponent(p[0]) == name) {
|
|
return p[1];
|
|
}
|
|
}
|
|
}
|
|
|
|
function createUUID() {
|
|
var s = [];
|
|
var hexDigits = '0123456789abcdef';
|
|
for (var i = 0; i < 36; i++) {
|
|
s[i] = hexDigits.substr(Math.floor(Math.random() * 0x10), 1);
|
|
}
|
|
s[14] = '4';
|
|
s[19] = hexDigits.substr((s[19] & 0x3) | 0x8, 1);
|
|
s[8] = s[13] = s[18] = s[23] = '-';
|
|
var uuid = s.join('');
|
|
return uuid;
|
|
}
|
|
})();
|