-
Elisa Giglio authoredElisa Giglio authored
script.js 5.39 KiB
'use strict';
import Secure from './secure.js';
import App from './app.js';
import RequestToDomain from './requests-to-domain.js';
// import * as jose from 'jose'; // per la gestione del token
const mySecure = new Secure();
let token = null;
let tokenTime = null; // momento in cui ottengo il token
let expirationTime = null; // momento a partire dal quale il token non sarà più valido
let alreadyRefreshed = false; // true se ho appena fatto la richiesta del token usando il refresh token
let oldTimeout = null;
const uri = window.location.toString();
if(!uri.includes('#')) {
const a = document.getElementById("my-link");
a.href = a.href.replace("$MY_CODE_CHALLENGE", mySecure.codeChallenge).replace("$MY_STATE", mySecure.state);
sessionStorage.setItem("stateSent", mySecure.state); // state inviato durante la richiesta dell'authcode
sessionStorage.setItem("codeVerifier", mySecure.codeVerifier);
}
else {
// l'uri e' del tipo localhost:3000/secured# seguito da parametri
const uriSplit = uri.split('#');
const params = uriSplit[1].split('&');
const uriState = queryStringGetValue(params[0]);
const uriAuthCode = queryStringGetValue(params[2]);
if(!sessionStorage.stateSent || sessionStorage.stateSent !== uriState) {
const body = document.getElementById('body-id');
body.innerHTML = "";
body.innerHTML = `Errors in the request!`;
}
else {
await requestFirstToken(uriAuthCode); // post per la richiesta del token
if(token !== null) {
// console.log(token);
tokenTime = moment();
expirationTime = tokenTime.add(token.expires_in,'s');
const requestsToDomain = new RequestToDomain();
// const myDomains = await requestsToDomain.getMyDomains();
const myDomains = [{nome: "casa1", stato:"on", admin: true},
{nome: "casa2", stato:"off", admin: false},
{nome: "casa3", stato:"on", admin: true},
{nome: "casa4", stato:"on", admin: false},
{nome: "casa4", stato:"on", admin: false},
{nome: "casa4", stato:"on", admin: false},
{nome: "casa4", stato:"on", admin: true},
{nome: "casa4", stato:"on", admin: false}
];
const app = new App(myDomains, requestsToDomain);
}
}
}
/**
* Ottengo il valore associato al parametro.
* @param {*} queryString query string del tipo parametro=valore.
* @returns il valore associato al parametro.
*/
function queryStringGetValue(queryString) {
const arr = queryString.split('=');
return arr[1];
}
/**
* Post per la prima richiesta del token.
* @returns il token ottenuto se la richiesta ha avuto successo, null altrimenti.
*/
async function requestFirstToken(uriAuthCode) {
const url = 'http://localhost:8080/realms/test00/protocol/openid-connect/token';
const response = await fetch(url, {
method: 'POST',
headers: {
'Content-type':'application/x-www-form-urlencoded'
},
body: new URLSearchParams({
grant_type: 'authorization_code',
client_id: 'myclient',
code_verifier: sessionStorage.getItem("codeVerifier"),
code: uriAuthCode,
redirect_uri: 'http://localhost:3000/secured'
})
});
token = await response.json();
if(response.ok) {
oldTimeout = timeoutRefresh();
}
else
token = null;
}
async function getToken() {
const now = moment();
if(now - expirationTime < 1) {
//this token has expired, so request new token
await requestUsingRefreshToken();
}
return token.access_token;
}
/**
* Post per la richiesta del token usando il refresh token.
*/
async function requestUsingRefreshToken() {
const url = 'http://localhost:8080/realms/test00/protocol/openid-connect/token';
const response = await fetch(url, {
method: 'POST',
headers: {
'Content-type':'application/x-www-form-urlencoded'
},
body: new URLSearchParams({
grant_type: 'refresh_token',
client_id: 'myclient',
refresh_token: `${token.refresh_token}`
})
});
token = await response.json();
if(response.ok) {
alreadyRefreshed = true;
oldTimeout = timeoutRefresh();
}
else
token = null;
}
/**
* Prima che scada il refresh token, richiedo nuovamente il token
* (usando il refresh token).
* @returns id di setTimeout()
*/
function timeoutRefresh() {
if(oldTimeout !== null)
clearTimeout(oldTimeout);
return setTimeout(async () => {
if(!alreadyRefreshed) {
await requestUsingRefreshToken();
alreadyRefreshed = false;
}
}, (token.refresh_expires_in*1000)-5000);
}
/**
* Effettua il logout.
*/
async function logoutKeycloak() {
clearTimeout(oldTimeout); // DA FARE: non funziona. Controllare come si fa il logout su keycloak!!!!
const url = 'http://localhost:8080/realms/test00/protocol/openid-connect/logout?redirect_uri=http://localhost:3000/secured';
const response = await fetch(url, {
method: 'POST',
headers: {
'Authorization': `Bearer ${await getToken()}`
}
}
);
if(response.ok)
token = null;
else
throw await response.json();
}
export {getToken, logoutKeycloak};