Javascript, HTML, CSS e... !
0 commenti

Utilizzando la stessa origine: googleusercontent.com

Condividere i Cookies tra progetti diversi in Google Apps Script

Creare e leggere cookie può rivelarsi utile in molte situazioni, come ad esempio salvare le dovute informazioni dell'utente in corso per far sì che all'accesso successivo alla Web App quest'ultimo si trovi loggato in modo automatico così come in un e-commerce per far ritrovare all'utente il carrello così come lo aveva lasciato l'ultima volta.

Con la presenza del Properties Service, che permette di salvare coppie chiave:valore a livello di script, utente o documento di uno script, add-on o web app, l'utilizzo dei cookie in Google Apps Script non trova particolare spazio di diffusione tuttavia essendo uno strumento da poter prendere in considerazione vale la pena descriverlo considerando anche che è possibile condividere tra diversi progetti l'informazione presente all'interno di un cookie.

Ponendo di avere il seguente template HTML (richiamato in doGet con il metodo createHtmlOutputFromFile di HtmlService), al click sul button 'set cookie' viene inviata la funzione che ho appositamente chiamato setCookie passando come parametri, nel caso specifico dell'esempio, il nome del cookie ('username'), il suo valore ('Michele Pisani') e la durata del cookie (365):

<!DOCTYPE html>
<html>
   <head>
      <base target="_top">
   </head>
   <body>
      <input type="button" onClick="setCookie('username', 'Michele Pisani', 365);" value="set cookie" />
      <input type="button" onClick="showCookie('username');" value="get cookie" />
      <div id="output" style="margin-top: 10px;"></div>
      <script>  
         function setCookie(cname, cvalue, exdays) {
             var d = new Date();
             var dt = d.getTime();
             d.setTime(dt + (exdays * 24 * 60 * 60 * 1000));
             var expires = "expires="+d.toUTCString();
             document.cookie = cname + "=" + cvalue + ";" + expires + ";path=/";
         }

         function getCookie(cname) {
             var name = cname + "=";
             var ca = document.cookie.split(';');
             var cn = "";
             for(var i = 0; i < ca.length; i++) {
                 var c = ca[i];
                 while (c.charAt(0) == ' ') {
                     c = c.substring(1);
                 }
                 if (c.indexOf(name) == 0) {
                     cn = c.substring(name.length, c.length);
                 }
             }
             return cn;
         }
         
         function showCookie(cname) {
             var res = getCookie(cname);
             var div = document.getElementById('output');
             div.innerHTML = res;
         }             
      </script>
   </body>
</html>

La riga di codice che genera il cookie è la seguente:

document.cookie = cname + "=" + cvalue + ";" + expires + ";path=/";

Ed il cookie generato, salvato nel browser, viene assegnato ad un terzo livello del nome a dominio googleusercontent.com relativo allo script in uso, nel caso specifico dell'esempio:

n-expqfjpwavrxuo2rhi3usqepbdrsyu4foclfoni-0lu-script.googleusercontent.com

La figura seguente (Fig. 1) mostra quanto appena descritto:



Cookie assegnato al dominio di terzo livello di googleusercontent.com relativo allo script in uso

Fig. 01 - Cookie assegnato al dominio di terzo livello di googleusercontent.com relativo allo script in uso


Di conseguenza solo lo script che ha generato il cookie può accedere al cookie stesso.

E' possibile tuttavia forzare la scrittura del cookie sul solo dominio di secondo livello, comune a tutti gli script, ovvero googleusercontent.com.
Per poter eseguire questa operazione è necessario dichiarare il dominio di cui sopra all'interno della stringa che genera il cookie (aggiungendo la parte: domain=.googleusercontent.com), pertanto l'ultimo codice mostrato diventerà:

document.cookie = cname + "=" + cvalue + ";" + expires + ";domain=.googleusercontent.com;path=/";

In questo modo, ponendo di avere 2 script distinti (intesi come due diversi progetti) è possibile salvare un valore all'interno del cookie tramite uno script e leggerne il contenuto dall'altro script.
La figura seguente (Fig. 2) mostra lo stesso cookie assegnato a livello di dominio di secondo livello:



Cookie assegnato al dominio di secondo livello googleusercontent.com relativo a tutti gli script

Fig. 02 - Cookie assegnato al dominio di secondo livello, googleusercontent.com, relativo a tutti gli script


Questo tipo di approccio può essere utilizzato anche all'interno di un Google Site incorporando gli script, pubblicati come Web App, tramite il loro indirizzo di pubblicazione.

Per utilità e completezza di informazione riporto di seguito 2 funzioni Javascript rispettivamente per la creazione e la lettura di un cookie:

// setCookie: crea un cookie accettando in ingresso i parametri relativi al nome, valore e durata (in giorni) del cookie
// Nel caso si volesse definire il dominio di creazione del cookie aggiungere alla relativa stringa: domain=.nome_domino;

function setCookie(cname, cvalue, exdays) {
    var d = new Date();
    var dt = d.getTime();
    d.setTime(dt + (exdays * 24 * 60 * 60 * 1000));
    var expires = "expires="+d.toUTCString();
    document.cookie = cname + "=" + cvalue + ";" + expires + ";path=/";
}


// getCookie: restituisce, qualora presente, il valore del cookie in base al nome passato come parametro

function getCookie(cname) {
    var name = cname + "=";
    var ca = document.cookie.split(';');
    var cn = "";
    for(var i = 0; i < ca.length; i++) {
        var c = ca[i];
        while (c.charAt(0) == ' ') {
            c = c.substring(1);
        }
        if (c.indexOf(name) == 0) {
            cn = c.substring(name.length, c.length);
        }
    }
    return cn;
}

Tags

Michele Pisani

Michele Pisani

Sviluppatore Javascript ed esperto in Digital Analytics

L'esperienza nel settore Digital Analytics unita ad anni di sviluppo in Javascript ha trovato la massima espressione in Google Apps Script che mi ha permesso, con estrema facilità e poche righe di codice, di realizzare potenti applicazioni interattive e processi automatizzati integrati con i prodotti della G Suite.

Come contattarmi
scrivi un commento

0 Commenti

Non ci sono commenti

Nessuno ha ancora commentato questo articolo, fallo tu per primo!

scrivi un commento

Scrivi un commento

Il tuo indirizzo email non sarà pubblicato.I campi contrassegnati da un * sono obbligatori
Puoi utilizzare i seguenti tag nei commenti:
[bold]testo[/bold] se vuoi evidenziare un testo con il grassetto[code]function helloworld() { }[/code] se vuoi pubblicare una porzione di codice[url]http://www.appsscript.it[/url] se devi riferirti ad un indirizzo web