Files
synologySsoClientExamplePage/js/myLoginScript.js
2023-12-22 17:21:31 +01:00

194 lines
6.0 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// ------------------------------------------------------------------------------
//
// © Copyright (с) 2023 License: GPLv3 https://www.gnu.org/licenses/gpl-3.0.txt
// Author: https://github.com/pgmr3
// ------------------------------------------------------------------------------
//has user access with this token?
const doTestLogedin = async (whenDone, $atoken="Default", $startLogout=false ) => {
let requestData = "";
if ($atoken === "Default") {
requestData = {
startLogout: $startLogout
}
} else {
requestData = {
accesstoken: $atoken,
startLogout: $startLogout
}
}
const phpScriptUrl = '/check_backend.php';
// Create the URL with the GET parameters
const queryString = Object.keys(requestData).map(key => `${encodeURIComponent(key)}=${encodeURIComponent(requestData[key])}`).join('&');
const fullUrl = `${phpScriptUrl}?${queryString}`;
console.log(fullUrl);
// Create a fetch request
fetch(fullUrl, {
method: 'GET',
mode: 'cors',//'no-cors',
credentials: 'include',
cache: 'no-store',
headers: {
'Content-Type': 'application/json'
//The following header enables CORS (replace "allowed-domain.com" with your allowed domain)
, 'Origin': 'SSO_HOST' //'allowed-domain.com'
}
})
.then(response => {
if (!response.ok) {
console.log("response.status =", response.status);
console.log(response);
throw new Error('response from check_backend.php was not ok');
}
return response.json();
})
.then (jsonResponse => {
// Erfolgreiche Anfrage
console.log(jsonResponse);
let logedin = false;
var message = "resonse no data";
var stringjson = "{no_data}"
//if (response && response.success && response.data) {
if (jsonResponse.success && jsonResponse.data) {
message = 'Logged in success, User name=' + jsonResponse.data.user_name + ', User ID=' + jsonResponse.data.user_id;
console.log(message);
stringjson = JSON.stringify(jsonResponse); // Converting JS object to JSON string
console.log(stringjson);
console.log("access");
//alert("access");//test
logedin = true;
}
else if (jsonResponse.successful) {
logedin = false;
console.log(jsonResponse);
console.log("no access after logout");
//alert("logged out");//test
//return jsonResponse;
//return jsonResponse.json(); // if logout
}
else {
console.log(jsonResponse);
console.log("no access");
//alert("no access");//test
logedin = false;
}
whenDone(logedin);//callback()
//Visibility(logedin, !logedin); //global
//Xlogedin = logedin; //global
return logedin;
//alert ("response in console");//Test
})
.catch(error => {
// Error in request
console.error('Error in response from check_backend.php:', error);
});
}
// access state ? echoSessionLifetime or nothing, after the session ends dom on /
function fetchAccess($echoSessionLifetime=false) {
// URL
const phpScriptUrl = '../check_lifetime.php';
// GET parameters
requestData = {
'echoSessionLifetime': $echoSessionLifetime // 'true',
//,foo: bar
}
// Create the URL with the GET parameters
const queryString = Object.keys(requestData).map(key => `${encodeURIComponent(key)}=${encodeURIComponent(requestData[key])}`).join('&');
const fullUrl = `${phpScriptUrl}?${queryString}`;
console.log(fullUrl);
// Create a fetch request
fetch(fullUrl, {
method: 'GET',
mode: 'cors',//'no-cors',
credentials: 'include',
cache: 'no-store',
headers: {
'Content-Type': 'application/json'
//The following header enables CORS (replace "allowed-domain.com" with your allowed domain)
, 'Origin': 'SSO_HOST' //'allowed-domain.com'
}
})
.then(response => {
if (!response.ok) {
console.log("response.status =", response.status);
console.log(response);
throw new Error('response from check_lifetime.php was not ok');
}
//header abfragen
if ( response.headers.get('State') === 'noAccess'){
window.location.replace("/"); // clear history
//this.done;
throw new Error('noAccess'); //The chain is aborted, no restart
}
//SessionLifetime is text
return response.text();
})
.then((text) => {
//SessionLifetime to document
document.getElementById('session-lifetime').innerHTML = text;
return;
})
.then (() => {
// delayed repetition
let start = Date.now();
while (Date.now() - start < 1000) { // 1 second
// wating
}
timer = setTimeout(fetchAccess($echoSessionLifetime), 0);
return;
})
.catch(error => {
// Error in request
console.error('Error in response from check_lifetime.php:', error);
});
console.log("check_lifetime.php fired");
}
// This variant works, but requires too many resources
// access state ? echoSessionLifetime or nothing, after the session ends dom on /
function fetchAccess_old($echoSessionLifetime=false) {
// URL
const phpScriptUrl = '../check_lifetime.php';
// GET parameters
requestData = {
'echoSessionLifetime': $echoSessionLifetime // 'true',
//,foo: bar
}
// Create the URL with the GET parameters
const queryString = Object.keys(requestData).map(key => `${encodeURIComponent(key)}=${encodeURIComponent(requestData[key])}`).join('&');
const fullUrl = `${phpScriptUrl}?${queryString}`;
console.log(fullUrl);
// AJAX-Anfrage
const xhr2 = new XMLHttpRequest();
xhr2.onreadystatechange = function () {
if (xhr2.readyState === xhr2.HEADERS_RECEIVED) {
const Astate = xhr2.getResponseHeader("State");
if (Astate === "noAccess") {
//window.location.href = ("/"); // clear history not
window.location.replace("/"); // clear history
xhr2.abort();
}
}
if (xhr2.readyState === XMLHttpRequest.DONE) {
if (xhr2.status === 200) {
console.log("$echoSessionLifetime: "+$echoSessionLifetime);
document.getElementById('session-lifetime').innerHTML = xhr2.responseText; //this also fire new fetchAccess()
timer = setTimeout(fetchAccess($echoSessionLifetime), 1000);
}
}
};
xhr2.open('GET', fullUrl, true);
xhr2.setRequestHeader('echoSessionLifetime', $echoSessionLifetime); // this doesn't work for php scripts
xhr2.send();
console.log("check_lifetime.php fired");
}