Attività purtroppo frequente e che richiede molto tempo, la reimpostazione della password degli studenti che l’hanno dimenticata non può essere delegata al singolo utente su Google Workspace for Education. I termini di servizio stabiliscono che nessun utente minorenne può accedere al recupero autonomo della password. Per di più, questo è impedito in maniera predefinita anche agli adulti – docenti o personale – di un dominio Google Workspace che non sia dichiarato di istruzione superiore. Che equivale per noi non alle scuole ‘superiori’, la secondaria di secondo grado, bensì all’Università: dove non essendoci utenti minorenni, il problema non si pone.

Una delle opzioni per diminuire il carico di lavoro dell’admin è abilitare alcuni colleghi come amministratori con ruolo definito. Dalle impostazioni della Console si possono aggiungere amministratori che non sono superadmin – quindi non possono modificare qualunque impostazione sulla Console – ma che si dedicano solamente al reset password. Non illustriamo qui questa procedura: è utile, ma in certe situazioni non aiuta. Promuovere altre persone ad amministratori – anche se con ruolo limitato – implica formazione e un certo grado di responsabilità. Dove questo è possibile, la soluzione del ruolo amministrativo di settore è semplice e raggiunge lo scopo.

Come funziona

La procedura qui descritta è utile per le situazioni in cui promuovere altre persone ad amministratore limitato non è la strada migliore. Il funzionamento finale del sistema qui proposto è semplice:

  • lo studente – o la famiglia – si rivolge a uno degli insegnanti di classe in caso di smarrimento della password
  • l’insegnante compila un modulo Google per la reimpostazione della password dello studente, e riceve una mail con la password provvisoria
  • l’insegnante comunica la password ricevuta allo studente o alla famiglia, con il mezzo più comodo
  • al primo accesso lo studente cambia la password provvisoria con una scelta da lui

Tutto questo avviene senza assegnare ruoli amministrativi all’insegnante. È sufficiente compilare un modulo Google inserendo l’indirizzo email dello studente, e uno script allegato pensa a tutta la procedura in automatico. Dopo pochi istanti l’insegnante riceve sul proprio indirizzo email Google Workspace una mail con la password provvisoria (creata dalla procedura di reimpostazione) da comunicare agli studenti.

Lo script esegue diverse verifiche durante le varie fasi della procedura. In caso vengano riscontrati errori, il richiedente riceve una mail di notifica con un’indicazione dell’errore – se possibile – e dell’indirizzo email di assistenza da contattare. Per alcuni tipi di errore anche l’admin riceve un’email di notifica.

Sicurezza

Alcuni aspetti fondamentali da tenere presenti riguardano la sicurezza di questa procedura, e il rispetto dei termini di servizio e la normativa vigente. Parte di tutto ciò è garantito dalla configurazione del modulo e dello script, che per essere funzionanti ed efficaci dovranno essere adattati alla situazione di ogni Istituto, come descritto più sotto. Un’altra parte altrettanto fondamentale è garantita invece dalla configurazione specifica che l’admin darà alla procedura, dalla scelta di chi può utilizzarla e dal comportamento di ogni insegnante che utilizza i dati del modulo e li diffonde. Raccomando quindi di non prendere ed applicare questo modulo così come fornito, ma di riflettere attentamente sulla sua implementazione alla luce delle considerazioni qui di seguito.

Chi può reimpostare la password?

Il modulo può essere utilizzato solo con l’account Google Workspace di Istituto, e solo da alcune categorie di utenti. Nel mio Istituto sono tutti gli insegnanti, anche se questa scelta può essere cambiata. L’admin deve modificare lo script – vedi sotto per le modalità – in modo da impostare l’unità organizzativa autorizzata all’utilizzo del modulo. Prima di elaborare la richiesta, lo script controlla l’account utilizzato per compilare il modulo. Se l’account fa parte dell’organizzazione autorizzata, la procedura prosegue, altrimenti non viene completata. Si può scegliere di autorizzare un limitato numero di insegnanti, o altra categoria, creando una sotto-unità organizzativa in cui inserire gli autorizzati.

A chi può essere reimpostata la password?

Specularmente, la reimpostazione della password con questo modulo può essere applicata solo ad alcune categorie di utenti, in questo caso gli studenti. Anche questa impostazione è gestita con le unità organizzative. Lo script verifica l’indirizzo email di cui l’insegnante richiede il reset password. Se appartiene all’organizzazione impostata dall’admin la procedura si conclude, altrimenti si interrompe.

Mentre infatti vogliamo semplificare la reimpostazione della password per gli studenti, dobbiamo proteggere con ulteriori accorgimenti il reset password per tutti gli altri account. Docenti e account amministrativi, in particolare, hanno privilegi elevati e contengono dati delicati. Poter reimpostare la password di questi account semplicemente inserendo il loro indirizzo email in un modulo – senza ulteriori verifiche – non è certo raccomandato. Consiglio quindi di non modificare lo script per fargli reimpostare la password di tutti gli utenti che non siano studenti: anche se tecnicamente possibile, aprirebbe una falla nella sicurezza molto importante.

File e script

La procedura lavora con due file – un modulo e il foglio di lavoro con le relative risposte – e uno script annesso al foglio di lavoro. Per utilizzarla nel tuo dominio è sufficiente copiare il foglio di lavoro che trovi a questo link: https://docs.google.com/spreadsheets/d/1Y3TexpGEV7emhqkE16KioYImmQde_yq6Jbd_BXgzl_s/edit?usp=sharing

Il file si apre in sola visualizzazione: dal menu File scegli Crea una copia, quindi seleziona una cartella del tuo Drive in cui copiare il file. Consiglio di creare una cartella dedicata a questa procedura. Automaticamente verrà creato nella cartella radice Il mio Drive anche il Modulo da utilizzare per la reimpostazione della password – non devi né crearlo né copiarlo. Sposta il modulo da Il mio Drive alla cartella dedicata che hai creato per il foglio di lavoro. È importante non rinominare i file a questo punto: verranno rinominati automaticamente nel modo corretto seguendo le indicazioni sottostanti.

Autorizzazioni e configurazione iniziale

Apri ora il foglio di lavoro – non il modulo – e attendi qualche secondo finché comparirà in alto, a fianco del menu Guida, la voce Funzioni utente. Cliccala, quindi scegli la voce 1 – Concedi autorizzazioni. Comparirà una schermata in cui scegliere l’account o inserire le credenziali (scegli o inserisci i dati del tuo account Google Workspace da amministratore), quindi accetta le richieste di autorizzazione. Clicca di nuovo il menu Funzioni utente, e scegli la voce 2 – Imposta primo avvio. Nel giro di pochi istanti sia il foglio di lavoro che il modulo verranno rinominati con il nome file definitivo. D’ora in avanti puoi spostare i due file, ma non rinominarli più (a meno di mettere mano allo script per personalizzarlo e cambiare alcune funzioni).

Effettua le modifiche per il tuo dominio

  1. Dal foglio di lavoro clicca sul menu Strumenti, quindi Editor di script. Sotto il commento // variabili da modificare con i dati dell’Istituto (dovrebbe trovarsi alla riga 11) trovi 3 righe da modificare con i valori adatti alla situazione del tuo Istituto:
    • le variabili uoDocenti e uoAlunni identificano rispettivamente l’unità organizzativa di chi è autorizzato ad utilizzare lo script (normalmente gli insegnanti) e quella degli account di cui è permesso reimpostare la password con questo script (normalmente gli alunni). Sostituisci i valori /Docenti e /Alunni con i percorsi delle rispettive unità organizzative, così come sono organizzate nel tuo dominio
    • la variabile emailAdmin identifica invece l’indirizzo email a cui rivolgersi in caso di problemi; potrebbe essere l’email dell’amministratore, oppure un indirizzo di servizio dedicato. In ogni caso, inseriscilo al posto della dicitura generica che trovi su questa riga
    • ricordati di salvare prima di chiudere la scheda; quindi chiudi anche il foglio di lavoro
  2. Apri ora il modulo, dove dovrai modificare solo un dettaglio. L’unica domanda presente contiene una convalida della risposta. Alla riga Testo > Contiene sostituisci la dicitura generica @miodominiogsuite.it con il tuo dominio reale (ricordati di premettere la @). In questo modo il modulo accetterà richieste solo per la reimpostazione della password di account del dominio – la verifica che siano effettivamente studenti viene effettuata non qui nel modulo, ma dallo script dietro le quinte.

Ora tutto è pronto per l’uso. Fai qualche prova per verificare che tutto si comporti come desiderato prima di distribuire il link del modulo alle persone che lo dovranno utilizzare.

Lo script

Copiando il modulo – come indicato sopra – viene già copiato anche lo script. Non devi fare altro che apportare quelle 3 modifiche indicate qui sopra. Per poter vedere struttura e funzionamento dello script, lo riporto comunque qui sotto.

function onOpen() {
  var ui = SpreadsheetApp.getUi();
  ui.createMenu('Funzioni utente')
  .addItem('1 - Concedi autorizzazioni', 'concediAutorizzazioni')
  .addItem('2 - Imposta primo avvio', 'impostaPrimoAvvio')
  .addToUi()
}
function reimpostaPassword(e) {
  
  // variabili da modificare con i dati dell'Istituto
  var uoDocenti = '/Docenti';
  var uoAlunni = '/Alunni';
  var emailAdmin = 'inserireEmailAdmin';
  
  // dati delle risposte al modulo
  var timestamp = e.values[0];
  var richiedente = e.values[1];
  var accountReimpostazione = e.values[2].trim();
  
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var foglioRisposte1 = ss.getSheetByName('Risposte del modulo 1');
  var cellaEsito = foglioRisposte1.getRange(foglioRisposte1.getLastRow(), 4);
  var urlModulo = FormApp.openById((DriveApp.getFileById(ss.getId()).getParents().next().getFilesByName('Reimposta password studente').next().getId())).getPublishedUrl();
  
  // controlla se il richiedente è autorizzato
  var utenteAutorizzato = verificaOrganizzazioneUtente(richiedente, uoDocenti);
  if (!utenteAutorizzato) {
    let oggetto = 'Operazione non autorizzata';
    let messaggio = `<p>Hai chiesto di reimpostare la password per l'account ${accountReimpostazione}, ma non sei 
    autorizzato a farlo.<br />Solo i docenti possono utilizzare il modulo dedicato.</p>
    <p>Se sei un docente e ritieni di ricevere questa email 
    per errore, segnala il problema all'amministratore di Google Workspace:<br />${emailAdmin}</p>`;
    let esito = 'richiedente non autorizzato';
    
    inviaEmail(richiedente, oggetto, messaggio);
    cellaEsito.setValue(esito);
    
    return;
  
  } else {
    var insegnante = richiedente;
  }
  
  
  //controlla che l'accountReimpostazione esista
  
  try {
    var esistente = AdminDirectory.Users.get(accountReimpostazione);
  }
  catch (e) {
    let oggetto = 'Operazione non autorizzata';
    let messaggio = `<p>Hai chiesto di reimpostare la password per l'account ${accountReimpostazione}, ma l'account risulta inesistente.<br />
      Prova a compilare nuovamente il <a href=${urlModulo}>modulo</a>, verificando di inserire correttamente l'indirizzo email dell'alunno.</p>
    <p>Se ritieni che questo sia un errore, segnala il problema all'amministratore di Google Workspace:<br />${emailAdmin}</p>`;
    let esito = 'reimpostazione non autorizzata - account inesistente';
    
    inviaEmail(richiedente, oggetto, messaggio);
    cellaEsito.setValue(esito);
    
    return;
  }
  
  
  // controlla che l'accountReimpostazione sia uno studente
  var reimpostazioneValida = verificaOrganizzazioneUtente(accountReimpostazione, uoAlunni);
  if (!reimpostazioneValida) {
    let oggetto = 'Operazione non autorizzata';
    let messaggio = `<p>Hai chiesto di reimpostare la password per l'account ${accountReimpostazione}, ma non risulta essere l'account di un alunno.<br />
    Il modulo può essere utilizzato solo per reimpostare la password degli alunni.</p>
    <p>Se ritieni che questo sia un errore, segnala il problema all'amministratore di Google Workspace:<br />${emailAdmin}</p>`;
    let esito = 'reimpostazione non autorizzata - non è studente';
    
    inviaEmail(richiedente, oggetto, messaggio);
    cellaEsito.setValue(esito);
    
    return;
    
  } else {
    var studente = accountReimpostazione;
  }
  
  
  // ----- se tutto ok, procede alla reimpostazione della password
  
  // genera la nuova password
  var password = ''; 
  var caratteriPassword = "123456789ABCDEFGHIJKLMNPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz"; 
  for (var j = 0; j < 8; j++) { 
    var posizioneCasuale = Math.floor(Math.random() * caratteriPassword.length); 
    password += caratteriPassword.substring(posizioneCasuale, posizioneCasuale + 1); 
  }
    
  // reimposta la password dell'utente
  var user = AdminDirectory.Users.get(studente); 
  user.password = password; 
  user.changePasswordAtNextLogin = true;
  AdminDirectory.Users.update(user, studente);
  
  // invia email con la nuova password provvisoria 
  let oggetto = `Reimpostazione della password per l'account ${studente} effettuata correttamente`;
  let messaggio = `<p>Hai richiesto la reimpostazione della password per l'account ${studente}. L'operazione è andata a buon fine.</p>
  <p>La password provvisoria è questa:<br />${password}</p>
  <p>Puoi inviare questa password allo studente o alla famiglia. Utilizzerà questa password per il prossimo accesso, poi dovrà cambiarla con una personalizzata.</p>
  <p>Ricorda di consegnare la password direttamente allo studente o a un genitore. Non va consegnata ad altri familiari o richiedenti.</p>`;
  let esito = `password reimpostata correttamente`;
  
  inviaEmail(insegnante, oggetto, messaggio);
  cellaEsito.setValue(esito);
  
  
}
// ----- funzioni ausiliarie
function verificaOrganizzazioneUtente(account, uo) {
  // controlla se appartiene ad un'unità organizzativa elencata nel foglio apposito, o ad una loro sotto-unità organizzativa
  var organizzazioneUtente = AdminDirectory.Users.get(account).orgUnitPath;
  // indexOf anzichè semplice includes, per testare se appartiene a sotto-unità organizzativa di una unità organizzativa presente nella lista
  return (organizzazioneUtente.indexOf(uo) > -1);
}
function inviaEmail(email, oggetto, messaggio) {
  GmailApp.sendEmail(email, oggetto, messaggio, {htmlBody: messaggio});
}
function concediAutorizzazioni() {
  
}
function impostaPrimoAvvio() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var props = PropertiesService.getScriptProperties();
  verificaTrigger(props);
  var impostazioniOk = props.getProperty('impostazioniOk');
  if (!impostazioniOk) {
    DriveApp.getFileById(ss.getId()).getParents().next().getFilesByName('Copia di Reimposta password studente').next().setName('Reimposta password studente');
    DriveApp.getFileById(ss.getId()).getParents().next().getFilesByName('Copia di Reimposta password studente (Risposte)').next().setName('Reimposta password studente (Risposte)');
    props.setProperty('impostazioniOk', true);
  }
}
// ----- verifica esistenza trigger, altrimenti lo crea
function verificaTrigger(props) {
  
  // cerca se già impostato trigger per funzione principale, altrimenti lo crea e memorizza creazione avvenuta in una proprietà
  if (props.getProperty('triggerPresente')) {
    return;  
  }
      
  var triggers = ScriptApp.getProjectTriggers();
  if (triggers.length > 0) {
    for (i = 0; i < triggers.length; i ++) {
      if (triggers[i].getHandlerFunction() == 'reimpostaPassword') {
        props.setProperty('triggerPresente', true);
      }
    }
  }
  
  if (triggers.length == 0 || !(props.getProperty('triggerPresente'))) {
    ScriptApp.newTrigger('reimpostaPassword')
      .forSpreadsheet(SpreadsheetApp.getActive())
      .onFormSubmit()
      .create();
      props.setProperty('triggerPresente', true);
  }
}

Lo script è abbastanza semplice e commentato. Se hai domande o chiarimenti sul funzionamento – o proposte di miglioramento – puoi usare i commenti all’articolo, più sotto.

Variazioni e approfondimenti

In alcune strutture organizzative lo script non è immediatamente applicabile, ma ha bisogno di alcune personalizzazioni. Pubblico qui di seguito alcune casistiche, aggiornate via via a partire dalle richieste fatte nei commenti. Se la situazione della tua scuola non è contemplata dagli esempi di questa pagina, usa i commenti per fare una richiesta. Se possibile, aggiornerò questa sezione con nuove proposte di variazione.

Lunghezza della password maggiore di 8 caratteri

Se nella sezione Sicurezza della console di amministrazione è stata impostata una lunghezza minima della password diversa da 8 caratteri (quella di default), è possibile cambiare la lunghezza della password generata dallo script modificando la riga 88:

for (var j = 0; j < 8; j++) {  

Sostituisci il numero 8 con la lunghezza desiderata e salva lo script.

Docenti e/o studenti ripartiti in più unità organizzative

Alcune scuole optano per una struttura organizzativa simile a questa:

  • Infanzia
    • Docenti
    • Alunni
  • Primaria
    • Docenti
    • Alunni
  • Secondaria
    • Docenti
    • Alunni

e così via. In questo scenario non è possibile individuare l’unità organizzativa degli autorizzati alla modifica password (docenti) o degli utenti cui la procedura può essere applicata (studenti) come indicato sopra. La variabile dello script infatti contiene una sola unità organizzativa che raggruppa i docenti (e un’altra per gli studenti).

In questo caso, si può modificare la procedura di verifica.

Lo script originale cerca il percorso dell’unità organizzativa dell’utente, e vede se è uguale o sottoinsieme di quello indicato nella variabile. Ad esempio, se indichiamo nella variabile l’unità organizzativa /Personale/Docenti, un docente che si trovi in /Personale/Docenti/Primaria è autorizzato. La verifica è stretta: è autorizzato se appartiene a /Personale/Docenti, o un’altra unità organizzativa contenuta in questa. Stessa logica, declinata diversamente, per gli studenti.

Le modifiche

Nella modifica proposta sotto, la verifica è meno stringente, ma più versatile. Indichiamo nella variabile non più l’unità organizzativa ‘contenitore’, ma una parola chiave che identifica tutte le unità organizzative che vogliamo includere. Se guardiamo la struttura esemplificativa sopra indicata, i docenti si trovano in uo diverse, ma tutti i loro percorsi contengono la parola chiave Docenti. Lo script ora cercherà il percorso dell’unità organizzativa dell’utente in questione, e controlla che al suo interno si trovi la parola chiave, indipendentemente da quello che la precede o segue. Come sopra, vale l’analogo anche per gli studenti.

Ecco le modifiche da apportare allo script. Modifichiamo riga 11 e 12 in questo modo:

var keywordUoDocenti = 'Docenti';
var keywordUoAlunni = 'Alunni';

Nota che, oltre al nome diverso delle variabili, abbiamo eliminato lo slash / dalla stringa: ora non serve più. Naturalmente, ogni scuola modificherà le due diciture Docenti e Alunni prendendo la nomenclatura giusta dalla propria struttura organizzativa.

Ora è sufficiente modificare le due occorrenze delle variabili rinominate. La riga 26 diventa dunque:

var utenteAutorizzato = verificaOrganizzazioneUtente(richiedente, keywordUoDocenti);

mentre la riga 65 diventa:

var reimpostazioneValida = verificaOrganizzazioneUtente(accountReimpostazione, keywordUoAlunni);

Non essendomi possibile testare al momento il dettaglio di questa soluzione, consiglio di creare un paio di account di prova (sia docente che alunno) e di fare alcuni test. Importante provare sia procedure di successo, che simulare eventuali errori, e vedere se la procedura si comporta come dovrebbe. In caso di problemi, potete segnalarli nei commenti.

Inviare la password ad un ulteriore indirizzo email

Alcune scuole hanno una lista di email dei genitori già verificate. Perché provengono dal gestionale, dal registro elettronico o sono utilizzate abitualmente per le comunicazioni con le famiglie. In tal caso è possibile saltare un passaggio rispetto alla procedura indicata sopra. L’email con la password può essere inviata quasi in copia anche all’indirizzo del genitore. L’insegnante che compila il modulo riceve comunque la mail con la password (o con l’indicazione dell’eventuale errore), ma non si deve fare carico di consegnare le credenziali reimpostate.

Consiglio di implementare questa procedura solo dove le email dei genitori siano verificare precedentemente; se vengono utilizzate mail indicate di volta in volta, non si ha certezza che la richiesta provenga veramente da un genitore. E potremmo consegnare le credenziali reimpostate potenzialmente a chiunque.

Per questa procedura modificata ho:

  • aggiunto una domanda nel modulo, in cui inserire l’indirizzo email ulteriore cui inviare le credenziali reimpostate
  • reimpostato leggermente lo script, in modo che acquisisca il nuovo dato, e invii la mail anche all’indirizzo ulteriore
  • effettuato alcuni ritocchi perchè la procedura si adatti al nuovo scenario

Visto che non ci sono modifiche sostanziali, è sufficiente:

Consiglio come sempre di fare alcuni test con account di prova, prima di utilizzarlo a regime. In particolare per questo file con modifiche, ho fatto alcuni test sul mio dominio, ma non ho ancora riscontri da domini diversi. Fai alcune prove – anche simulando errori – e se tutto funziona utilizzalo. Se incontri errori o comportamenti imprevisti, puoi segnalarli nei commenti e cercherò di sistemare.


Ho ultimato un’altra procedura per permettere il recupero autonomo della password da parte dei docenti. Similmente a quella presentata in questa pagina, si compone di due moduli e uno script. Il procedimento è leggermente più complesso: introduce alcune forme di controllo per prevenire reset della password non autorizzati. Indicazioni nel post dedicato.

Questo errore è visibile solamente agli amministratori WordPress

Errore: Nessun feed trovato.

Vai alla pagina delle impostazioni del feed di Instagram per creare un feed.