Reimpostazione password studenti semplificata in G Suite

EDIT 02.11.2020
Ho sistemato un refuso e una lacuna nello script, che provocavano un’interruzione imprevista nell’esecuzione e la non creazione del trigger per l’attivazione automatica della procedura.
Ora il file linkato sotto contiene tutti gli aggiornamenti: è sufficiente copiare nuovamente il file e ripetere la procedura indicata, e tutto dovrebbe funzionare. Consiglio di eliminare prima i file precedenti.
Più sotto trovi anche il testo dello script aggiornato.

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 G Suite 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 G Suite 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 G Suite una mail con la password provvisoria da comunicare.

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 G Suite 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 il reset 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 stessa cartella 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.

Effettua le modifiche per il tuo dominio

  1. 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 G Suite 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).
  2. A questo punto 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
  3. 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 G Suite:<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 G Suite:<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 G Suite:<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.


Sto ultimando 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. Non appena pronto, sarà pubblicato su questo blog.

Se vuoi essere avvisato dei prossimi articoli, iscriviti alla Newsletter: riceverai una notifica quando viene pubblicato un nuovo post su questo sito.

Condividi questo contenuto

Taggato come

11 Commenti

  1. Giorgio Rispondi

    Ho scaricato e fatto qualche prova. Sembra che funzioni tutto.
    E’ fantastico! Passo un sacco di tempo a resettare password.
    Grazie Mille

  2. Mario Rispondi

    Complimenti.
    Mi servirebbe uno script simile per bloccare la compilazione di un modulo solo ad una sottounità organizzativa. Puoi aiutarmi?

    1. Daniele Debiagi

      ciao Mario.
      1. va applicato ad uno script come questo – per reimpostazione password – o serve ad altri scopi?
      2. ti interessa bloccare la compilazione vera e propria del modulo, o è sufficiente che dopo la compilazione venga bloccata l’esecuzione dello script che ne consegue se l’utente non è autorizzato? questo secondo scenario è più semplice da gestire, e già compreso nello script di questo post

  3. mario Rispondi

    Salve Daniele,
    grazie per la risposta immediata,
    mi serve per somministrare prove ad alcuni alunni e voglio consentire solo ad alcuni alunni di entrare nel modulo, mentre a quelli a cui non è consentito deve uscire un messaggio del tipo “non sei autorizzato a consultare le domande di questo modulo”.
    Mi piacerebbe anche registrare le risposte date fino al termine del tempo messo a disposizione per la compilazione del modulo, visualizzando un avviso dei secondi rimasti a disposizione, (tipo Kahoot).
    Chiedo troppo?

    1. Daniele Debiagi

      prima richiesta: un po’ complesso, ma credo si potrebbe fare. se vuoi qualcosa del genere devi utilizzare classi e metodi di Form Services: https://developers.google.com/apps-script/reference/forms. io li uso poco, solitamente creo script che agiscono sul foglio di lavoro delle risposte – come quello in questo post – non saprei indicarti al volo. da una scorsa veloce si potrebbero utilizzare le funzioni per la creazione del form direttamente da script, e poi inviare il link per mail dopo verifica condizionale se l’utente è tra gli autorizzati. mi sembra comunque molto laborioso per il risultato – se il modulo è un test/verifica, andrebbe rifatto quasi tutto ogni volta. se invece è un modulo più duraturo, forse si può investire il tempo
      probabilmente è più agevole fare una cosa come doppio modulo: il primo serve solo a raccogliere gli indirizzi email; se l’indirizzo è autorizzato, lo script invia il link per il secondo, che è il modulo vero e proprio. non è una vera forma di blocco, ma potrebbe fare quasi lo stesso servizio

    2. Daniele Debiagi

      seconda richiesta: molto complesso. siamo a livello di add-on ben strutturato, serve agire anche sull’interfaccia della pagina web: serve un insieme di script che gestiscono sia il flusso dati che la presentazione della pagina. forse tra i componenti aggiuntivi si trova già qualcosa, poi lì il problema è che se lavori per gli alunni il tema privacy e trattamento dei dati diventa cruciale, e pochissimi add-on sono gdpr compliant

  4. Marco Rossetti Rispondi

    Ciao
    Ho provato lo script ed è utilissimo.
    Volevo sapere se si può fare in modo che venga inviata la mail con la password temporanea direttamente all’indirizzo di recupero indicata nell’account?
    Spero di non chiudere troppo.

    Grazie Marco

    1. Daniele Debiagi

      ciao Marco. se ho capito bene, tu hai inserito per ogni studente un indirizzo email di recupero (quindi un indirizzo email personale dello studente, o dei genitori) e vorresti che lo script recuperi quell’indirizzo dietro le quinte per inviare la mail direttamente a quello, senza passare per il docente?

  5. Marco Rossetti Rispondi

    Si, vorrei far si che lo script facesse quello che hai detto. ti spiego come vorrei organizzare la procedura nella mia scuola, io consegno il modulo ai coordinatori, non a tutti i docenti per evitare che i ragazzi chiedano a più professori, i coordinatori non hanno bisogno di fare alcuna verifica perchè conoscono l’alunno e utilizzando il modulo questo invia la mail direttamente all’indirizzo fornito per il recupero. Così da evitare il passaggio di mano della password di recupero o errori di invio.
    ciao e grazie

    1. Daniele Debiagi

      potresti fare così – occhio che i numeri di riga fanno riferimento allo script pubblicato in questo post, il tuo potrebbe avere numeri di riga non coincidenti in caso di modifiche:

      – aggiungi in riga 100:
      var emailRecuperoStudente = user.recoveryEmail;

      – modifichi riga 109 così:
      inviaEmail(emailRecuperoStudente, oggetto, messaggio);

      dovresti ottenere al volo quanto chiedi
      fai qualche prova prima di implementarlo
      attenzione che questo è solo un suggerimento, non è previsto un controllo errore
      in caso lo studente non abbia email di recupero impostata lo script si interromperà con un errore
      per implementazione fatta bene, dovresti prevedere cosa fare in caso di errore, con un try… catch, oppure una verifica con if; per implementazione più artigianale puoi anche lasciare così, e se la reimpostazione non avviene si controlla

  6. Mario Rispondi

    Grazie Daniele, pensavo anche io fosse complesso.
    Attualmente uso questbase per fare verifiche e pensavo di sostituirlo con moduli perché non viene più implementato e mi potrei trovare in una situazione di mancanza di assistenza o di indisponibilità del server come è già successo.
    Per favore ti chiedo si segnalarmi se hai da suggerirmi soluzioni alternative per realizzare verifiche a risposta multipla, con l’assegnazione di punti diversi per ogni opzione e un punteggio bonus per chi seleziona tutte e solo le opzioni corrette, con un tempo per ogni domanda modificabile e con accesso riservato solo agli alunni selezionati.
    Saluti

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.

Iscriviti alla Newsletter

I tuoi dati rimarranno privati; verranno condivisi solo con chi rende possibile questo servizio. Leggi la privacy policy.