Skip to content
Snippets Groups Projects
script.js 5.95 KiB
Newer Older
  • Learn to ignore specific revisions
  • 'use strict';
    
    Elisa Giglio's avatar
    Elisa Giglio committed
    import Secure from './secure.js';
    
    Elisa Giglio's avatar
    Elisa Giglio committed
    import App from './app.js';
    import RequestToDomain from './requests-to-domain.js';
    
    // import * as jose from 'jose';  // per la gestione del token
    
    
    Alfredo Chissotti's avatar
    Alfredo Chissotti committed
    import { getKeycloakRealm, getKeycloakURL, getMyURL } from './configuration.js';
    
    
    
    const mySecure = new Secure();
    
    
    Elisa Giglio's avatar
    Elisa Giglio committed
    let token = null;
    
    Elisa Giglio's avatar
    Elisa Giglio committed
    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(`#`) && !uri.includes("/secured/home/")) {
    
        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);
    
        //automatically redirect to the login page
        window.location.href = a.href;
    
    Elisa Giglio's avatar
    Elisa Giglio committed
    else if(uri.includes("#")){
    
        // 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) {
    
            // get the body element
    
            const body = document.getElementsByTagName(`body`)[0];
    
            body.innerHTML =  `Errors in the request!`;
    
        }
        else {
    
    Elisa Giglio's avatar
    Elisa Giglio committed
            await requestFirstToken(uriAuthCode);  // post per la richiesta del token
    
    Elisa Giglio's avatar
    Elisa Giglio committed
            if(token !== null) {
    
                expirationTime = moment().add(token.expires_in,`s`);
    
                sessionStorage.setItem("expirationTime", expirationTime.toJSON());
    
    Alfredo Chissotti's avatar
    Alfredo Chissotti committed
    
    
                const myDomains = await RequestToDomain.getMyDomains();
    
    Elisa Giglio's avatar
    Elisa Giglio committed
    // const myDomains = [{nome: "casa1", stato:"on", admin: true},
    //                    {nome: "casa2", stato:"off", admin: false},
    //                    {nome: "casa3", stato:"off", 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}
    //                 ];
    
    Elisa Giglio's avatar
    Elisa Giglio committed
    
    
    Alfredo Chissotti's avatar
    Alfredo Chissotti committed
                const app = new App(myDomains);
    
    Elisa Giglio's avatar
    Elisa Giglio committed
            }
    
    } else if(uri.includes(`/secured/home/`)) {
        token = JSON.parse(sessionStorage.getItem(`token`));
        expirationTime = moment(sessionStorage.getItem(`expirationTime`));
    
        oldTimeout = timeoutRefresh();
    
         * 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];
    
    Alfredo Chissotti's avatar
    Alfredo Chissotti committed
     * Post per la richiesta del token;
     *  imposta il token ottenuto
    
    Elisa Giglio's avatar
    Elisa Giglio committed
     */
    
    Elisa Giglio's avatar
    Elisa Giglio committed
    async function requestFirstToken(uriAuthCode) {
    
    Elisa Giglio's avatar
    Elisa Giglio committed
    
    
    Alfredo Chissotti's avatar
    Alfredo Chissotti committed
        const url = `${getKeycloakURL()}realms/${getKeycloakRealm()}/protocol/openid-connect/token`;
    
    Elisa Giglio's avatar
    Elisa Giglio committed
        const response = await fetch(url, {
    
            method: `POST`,
    
    Elisa Giglio's avatar
    Elisa Giglio committed
            headers: {
    
                'Content-type':`application/x-www-form-urlencoded`
    
    Elisa Giglio's avatar
    Elisa Giglio committed
            },
            body: new URLSearchParams({
    
                grant_type: `authorization_code`,
                client_id: `myclient`,
    
    Elisa Giglio's avatar
    Elisa Giglio committed
                code_verifier: sessionStorage.getItem("codeVerifier"),
                code: uriAuthCode,
    
    Alfredo Chissotti's avatar
    Alfredo Chissotti committed
                redirect_uri: `${getMyURL()}secured`
    
    Elisa Giglio's avatar
    Elisa Giglio committed
            })
        });
    
    Elisa Giglio's avatar
    Elisa Giglio committed
        token = await response.json();
        if(response.ok) {
    
            sessionStorage.setItem("token", JSON.stringify(token));
    
    Elisa Giglio's avatar
    Elisa Giglio committed
            oldTimeout = timeoutRefresh();
        }
    
    Elisa Giglio's avatar
    Elisa Giglio committed
        else
    
    Elisa Giglio's avatar
    Elisa Giglio committed
            token = null;
    
    Elisa Giglio's avatar
    Elisa Giglio committed
    }
    
    
    Elisa Giglio's avatar
    Elisa Giglio committed
    
    async function getToken() {
        const now = moment();
        if(now - expirationTime < 1) {
            //this token has expired, so request new token
            await requestUsingRefreshToken();
        }
    
        return token.access_token;
    
    Elisa Giglio's avatar
    Elisa Giglio committed
    }
    
    
    Elisa Giglio's avatar
    Elisa Giglio committed
    
    
    Elisa Giglio's avatar
    Elisa Giglio committed
    /**
    
    Elisa Giglio's avatar
    Elisa Giglio committed
     * Post per la richiesta del token usando il refresh token.
    
    Elisa Giglio's avatar
    Elisa Giglio committed
     */
    
    Elisa Giglio's avatar
    Elisa Giglio committed
     async function requestUsingRefreshToken() {
    
    Alfredo Chissotti's avatar
    Alfredo Chissotti committed
        const url = `${getKeycloakURL()}realms/${getKeycloakRealm()}/protocol/openid-connect/token`;
    
    Elisa Giglio's avatar
    Elisa Giglio committed
        const response = await fetch(url, {
    
            method: `POST`,
    
    Elisa Giglio's avatar
    Elisa Giglio committed
            headers: {
    
                'Content-type':`application/x-www-form-urlencoded`
    
    Elisa Giglio's avatar
    Elisa Giglio committed
            },
            body: new URLSearchParams({
    
                grant_type: `refresh_token`,
                client_id: `myclient`,
    
    Elisa Giglio's avatar
    Elisa Giglio committed
                refresh_token: `${token.refresh_token}`
            })
        });
        token = await response.json();
    
    Elisa Giglio's avatar
    Elisa Giglio committed
        if(response.ok) {
    
    Elisa Giglio's avatar
    Elisa Giglio committed
            alreadyRefreshed = true;
    
            sessionStorage.setItem("token", JSON.stringify(token));
    
            expirationTime = moment().add(token.expires_in,`s`);
    
            sessionStorage.setItem("expirationTime", expirationTime.toJSON());
    
    Elisa Giglio's avatar
    Elisa Giglio committed
            oldTimeout = timeoutRefresh();
    
    Elisa Giglio's avatar
    Elisa Giglio committed
        else
    
    Elisa Giglio's avatar
    Elisa Giglio committed
            token = null;
    }
    
    
    /**
    
     * Prima che scada il refresh token, richiedo nuovamente il token
    
    Elisa Giglio's avatar
    Elisa Giglio committed
     * (usando il refresh token).
     * @returns id di setTimeout()
     */
    function timeoutRefresh() {
        if(oldTimeout !== null)
            clearTimeout(oldTimeout);
    
        return setTimeout(async () => {
            if(!alreadyRefreshed) {
                await requestUsingRefreshToken();
                alreadyRefreshed = false;
            }
    
        }, 10000);//(token.refresh_expires_in*1000)-5000);
    
    Elisa Giglio's avatar
    Elisa Giglio committed
    }
    
    
    Elisa Giglio's avatar
    Elisa Giglio committed
    
    /**
     * Effettua il logout.
     */
    async function logoutKeycloak() {
    
        if(token == null)
            return;
    
    Alfredo Chissotti's avatar
    Alfredo Chissotti committed
        clearTimeout(oldTimeout); // DA FARE: funziona, ma vedere se fare il redirect alla pagina iniziale.
    
    Alfredo Chissotti's avatar
    Alfredo Chissotti committed
        window.location.href = `${getKeycloakURL()}realms/${getKeycloakRealm()}/protocol/openid-connect/logout?id_token_hint=${await getIdToken()}`;
    
    Elisa Giglio's avatar
    Elisa Giglio committed
    }
    
    
    async function getIdToken() {
        const now = moment();
        if(now - expirationTime < 1) {
            //this token has expired, so request new token
            await requestUsingRefreshToken();
        }
        return token.id_token;
    
    Elisa Giglio's avatar
    Elisa Giglio committed
    }
    
    
    Elisa Giglio's avatar
    Elisa Giglio committed
    export {getToken, logoutKeycloak};