Skip to content

Instantly share code, notes, and snippets.

@german-bortoli
Created March 25, 2016 15:10
Show Gist options
  • Star 5 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save german-bortoli/d41b5f60dd8097405b6b to your computer and use it in GitHub Desktop.
Save german-bortoli/d41b5f60dd8097405b6b to your computer and use it in GitHub Desktop.
Grafana auto login
$( document ).ready(function() {
/**
* Cookies management library
*
* @type type
*/
var helperCookie = {
findAll: function () {
var cookies = {};
_(document.cookie.split(';'))
.chain()
.map(function (m) {
return m.replace(/^\s+/, '').replace(/\s+$/, '');
})
.each(function (c) {
var arr = c.split('='),
key = arr[0],
value = null;
var size = _.size(arr);
if (size > 1) {
value = arr.slice(1).join('');
}
cookies[key] = value;
});
return cookies;
},
find: function (name) {
var cookie = null,
list = this.findAll();
_.each(list, function (value, key) {
if (key === name)
cookie = value;
});
return cookie;
},
create: function (name, value, time) {
var today = new Date(),
offset = (typeof time == 'undefined') ? (1000 * 60 * 60 * 24) : (time * 1000),
expires_at = new Date(today.getTime() + offset);
var cookie = _.map({
name: escape(value),
expires: expires_at.toGMTString(),
path: '/'
}, function (value, key) {
return [(key == 'name') ? name : key, value].join('=');
}).join(';');
document.cookie = cookie;
return this;
},
destroy: function (name, cookie) {
if (cookie = this.find(name)) {
this.create(name, null, -1000000);
}
return this;
}
};
/**
* Helper functions
*/
var helper = function () {
/**
* Get a parameter from query string URL
*
* @param {type} sParam
* @returns {grafana_script_L1.helper.getUrlParameter.sParameterName|Boolean}
*/
this.getUrlParameter = function (sParam) {
var sPageURL = decodeURIComponent(window.location.search.substring(1)),
sURLVariables = sPageURL.split('&'),
sParameterName,
i;
for (i = 0; i < sURLVariables.length; i++) {
sParameterName = sURLVariables[i].split('=');
if (sParameterName[0] === sParam) {
return sParameterName[1] === undefined ? true : sParameterName[1];
}
}
}
/**
* From PHP JS
*
* @param {type} str
* @returns {unresolved}
*/
this.url_decode = function (str) {
return decodeURIComponent((str + '')
.replace(/%(?![\da-f]{2})/gi, function () {
// PHP tolerates poorly formed escape sequences
return '%25';
})
.replace(/\+/g, '%20'));
};
/**
* From PHPJS
*
* @param {type} data
* @returns {String}
*/
this.base64_decode = function (data) {
var b64 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
var o1, o2, o3, h1, h2, h3, h4, bits, i = 0,
ac = 0,
dec = '',
tmp_arr = [];
if (!data) {
return data;
}
data += '';
do {
h1 = b64.indexOf(data.charAt(i++));
h2 = b64.indexOf(data.charAt(i++));
h3 = b64.indexOf(data.charAt(i++));
h4 = b64.indexOf(data.charAt(i++));
bits = h1 << 18 | h2 << 12 | h3 << 6 | h4;
o1 = bits >> 16 & 0xff;
o2 = bits >> 8 & 0xff;
o3 = bits & 0xff;
if (h3 == 64) {
tmp_arr[ac++] = String.fromCharCode(o1);
} else if (h4 == 64) {
tmp_arr[ac++] = String.fromCharCode(o1, o2);
} else {
tmp_arr[ac++] = String.fromCharCode(o1, o2, o3);
}
} while (i < data.length);
dec = tmp_arr.join('');
return dec.replace(/\0+$/, '');
}
};
var oHelper = new helper(),
t = oHelper.getUrlParameter('t');
if (typeof (t) == 'undefined') {
return false;
}
if (t.length == 0) {
return false;
}
try {
var t_decoded = oHelper.base64_decode(oHelper.url_decode(t)),
ojson = $.parseJSON(t_decoded);
if (typeof (ojson.user) == 'undefined' || typeof (ojson.pass) == 'undefined') {
throw "Undefined type";
}
if (ojson.user.lenght == 0 || ojson.pass.lenght == 0) {
throw "User or password empty";
}
} catch (e) {
return false;
}
if (typeof (ojson.redirect_to) != 'undefined') {
helperCookie.create("redirect_to", ojson.redirect_to);
}
$('body').css('backgroundColor', '#FFF').hide();
setTimeout(function () {
var $form = $("form.login-form");
if ($form.length > 0) {
$form.find("input[name=username]").val(ojson.user).trigger("input");
$form.find("input[name=password]").val(ojson.pass).trigger("input");
$form.find("button[type=submit]").trigger('click');
}
}, 500);
});
@nightcatnl
Copy link

Hi!

Can you tell me how to use the script ?

I try to auto login to Grafana from a kiosk configured RPi with chromium.

No idea how to use your script..... Would be a great solution for me !

@kccheung
Copy link

Yes, it would be great if you could provide some instructions on how to use it.

@peorthyr
Copy link

just to clarify, the script uses a cookie passed to the page and in which there are username and password, here a comment of the author on another thread about it:

You receive an input parameter like ?t=base64 of a json with {user: USERNAME, pass: PASS, redirect_to: _URL_TO_REDIRECT }

You shall include that script into the login page.

@german-bortoli
Copy link
Author

Yes, sorry, I never mentioned the thread, this refers to this issue grafana/grafana#3752 (comment)

@SercanSensulun
Copy link

Dear,
Is there any implementation which includes Html codes with this js document since I cannot implement simple login form with it?

@marlexladag
Copy link

Hi May I know if this script still works on the new version of grafana. Also how to implement this.

Thanks.

@justinepj
Copy link

Hi, The redirect_to cookie can't be set because it is httponly. Any idea how to set the redirect URL after login?

Thanks,

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment