[Risolto] Configurare Gmail per log (OAuth2.0)

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
korda
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1720
Iscrizione: giovedì 24 dicembre 2020, 15:58

[Risolto] Configurare Gmail per log (OAuth2.0)

Messaggio da korda »

Ho un account Gmail di servizio che uso per mandarmi mail di log tramite sendmail + msmtp.

Finora tutto bene e funzionante, se non che ad un certo punto trovo questa mail da Google che dice:
Per proteggere meglio il tuo account, Google non supporterà più l'uso di app o dispositivi di terze parti che ti chiedono di accedere all'Account Google utilizzando solo il nome utente e la password. Dovrai invece accedere utilizzando Accedi con Google o altre tecnologie più sicure, ad esempio OAuth 2.0. Scopri di più
Benissimo... cerco un poco in giro e trovo questo.

Clono il repository, lo installo, leggo per bene i vari update nei post e ricopio lo script. Leggo i commenti e a questo punto mi blocco sulla cosa più banale:

Codice: Seleziona tutto

# Set up your Consumer and Token as per usual. Just like any other
# three-legged OAuth request.
Dove/come lo recupero il token???
Ultima modifica di korda il lunedì 28 marzo 2022, 11:01, modificato 1 volta in totale.
Io non sono Bagheera né Akela, io non frequento la Rupe.
Io sono Kaa: faccio ballare le scimmie alle Tane Fredde.
rai
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2848
Iscrizione: domenica 11 maggio 2008, 18:03
Desktop: plasma
Distribuzione: 22.04
Località: Palermo

Re: Configurare Gmail per log (OAuth2.0)

Messaggio da rai »

Usa i consigli di questa risposta https://stackoverflow.com/a/37267330 che è l'applicazione pratica usando Python di quello che spiega Google

Riassumendo: vai su https://console.developers.google.com loggato col tuo account.
Clic sul pulsante [Create Project] -> clic [Enable an API] o qualcosa del genere e scegli tutte le API che ti servono.
Per API per il cui accesso è richiesta l'autorizzazione dell'utente, come per Gmail, seleziona Credentials nella colonna Sn -> clic su [Create Credentials] -> OAuth client ID -> tipo di applicazione Desktop -> Alla fine [Create client ID] per generare le tue credenziali OAuth.
dopo di ché devi scaricarle con clic sull'icona del [Donwnload Json] e te le salvi con un nome a piacere.
Queste credenziali non si modificano e qualificano presso Google la tua app come autorizzata a richiedere il TOKEN di accesso alle API che invocherai.

Il TOKEN viene rilasciato da Google dopo che l'account dà il consenso nel browser.
Va salvato localmente in un file [per es. xyz_storage.json].
Viene rilasciato per un determinato livello di accesso alle risorse o alle azioni concesse [SCOPES] ed è valido solo per quell'ambito.
Se si cambia lo SCOPE occorre un token nuovo, previo nuovo user consent
Ti puoi salvare file storage diversi, contenenti token per scope diversi.
Il token è single access ma se valido per lo scope richiesto ne viene automaticamente fatto il refresh
korda
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1720
Iscrizione: giovedì 24 dicembre 2020, 15:58

Re: Configurare Gmail per log (OAuth2.0)

Messaggio da korda »

Grazie delle preziose indicazioni, @rai: appena posso ci proverò sicuramente :birra:

Come alternativa a questo giro di autenticazioni qualcuno mi consigliava di sfruttare il relay sulla porta 25. Non l'ho mai fatto prima però...
Io non sono Bagheera né Akela, io non frequento la Rupe.
Io sono Kaa: faccio ballare le scimmie alle Tane Fredde.
rai
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2848
Iscrizione: domenica 11 maggio 2008, 18:03
Desktop: plasma
Distribuzione: 22.04
Località: Palermo

Re: Configurare Gmail per log (OAuth2.0)

Messaggio da rai »

korda ha scritto:
venerdì 25 marzo 2022, 10:09
Come alternativa a questo giro di autenticazioni qualcuno mi consigliava di sfruttare il relay sulla porta 25. Non l'ho mai fatto prima però...
ti riferisci a una cosa di questo tipo? perchè credo che lì serva un upgrade a pagamento
korda
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1720
Iscrizione: giovedì 24 dicembre 2020, 15:58

Re: Configurare Gmail per log (OAuth2.0)

Messaggio da korda »

rai ha scritto:
venerdì 25 marzo 2022, 12:18
korda ha scritto:
venerdì 25 marzo 2022, 10:09
Come alternativa a questo giro di autenticazioni qualcuno mi consigliava di sfruttare il relay sulla porta 25. Non l'ho mai fatto prima però...
ti riferisci a una cosa di questo tipo? perchè credo che lì serva un upgrade a pagamento
Sì, penso sia proprio quello: difatti chi me l'ha consigliato parlava proprio di mail inviate da stampanti.

Io devo inviare mail di log da un RaspberryPI e questa persona mi consigliava di sfruttare questo meccanismo in modo analogo a quanto già fanno altre periferiche (non mie però)
Io non sono Bagheera né Akela, io non frequento la Rupe.
Io sono Kaa: faccio ballare le scimmie alle Tane Fredde.
korda
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1720
Iscrizione: giovedì 24 dicembre 2020, 15:58

Re: Configurare Gmail per log (OAuth2.0)

Messaggio da korda »

@rai: il metodo per ottenere questo token è un poco macchinoso, perché ovviamente serve per altri scopi che non mandare banalmente mail di log da uno script bash :shy:

Già al primo accesso Google Cloud Platform mi dà il benvenuto con un banner del tipo:
Immagine
...e mi sento già un poco in soggezione (sia mai che combini qualche ca22ata che poi devo pagare :shy: )

Un poco per volta ci arrivo, attualmente sono arenato sul punto d. dello specchietto: non trovo la generica voce altro dal menù a tendina, solo opzioni ben specifiche (app di Android, app di Chrome, app di iOS, ecc.). Non mi rassegno: se trovo il bandolo magari propongo la procedura per una wiki.

Immagine
Io non sono Bagheera né Akela, io non frequento la Rupe.
Io sono Kaa: faccio ballare le scimmie alle Tane Fredde.
rai
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2848
Iscrizione: domenica 11 maggio 2008, 18:03
Desktop: plasma
Distribuzione: 22.04
Località: Palermo

Re: Configurare Gmail per log (OAuth2.0)

Messaggio da rai »

Sì, se sbagli percorso rischi di vederti chiedere decine di migliaia di euro 🤣 per esempio per certificare la tua app

Scrivo dal telefono in pausa lavoro. Appena posso ti do assistenza. Considera che le credenziali devi ottenerle una volta sola. Lo stesso vale (in genere) per i Token di accesso alle API.
E comunque richiesta e refresh del token li automatizzi nel tuo script, mica li fai a mano. Dopo ti posto una funzione di esempio
korda
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1720
Iscrizione: giovedì 24 dicembre 2020, 15:58

Re: Configurare Gmail per log (OAuth2.0)

Messaggio da korda »

rai ha scritto:
venerdì 25 marzo 2022, 16:12
Sì, se sbagli percorso rischi di vederti chiedere decine di migliaia di euro 🤣 per esempio per certificare la tua app

Scrivo dal telefono in pausa lavoro. Appena posso ti do assistenza. Considera che le credenziali devi ottenerle una volta sola. Lo stesso vale (in genere) per i Token di accesso alle API.
E comunque richiesta e refresh del token li automatizzi nel tuo script, mica li fai a mano. Dopo ti posto una funzione di esempio
Uh... fai con comodo... io ho appena staccato da lavoro.

Il RasPI sta in ufficio, e fino a lunedì non ci metterò mano :D
Io non sono Bagheera né Akela, io non frequento la Rupe.
Io sono Kaa: faccio ballare le scimmie alle Tane Fredde.
rai
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2848
Iscrizione: domenica 11 maggio 2008, 18:03
Desktop: plasma
Distribuzione: 22.04
Località: Palermo

Re: Configurare Gmail per log (OAuth2.0)

Messaggio da rai »

korda ha scritto:
venerdì 25 marzo 2022, 15:17
Un poco per volta ci arrivo, attualmente sono arenato sul punto d. dello specchietto: non trovo la generica voce altro dal menù a tendina, solo opzioni ben specifiche (app di Android, app di Chrome, app di iOS, ecc.). Non mi rassegno: se trovo il bandolo magari propongo la procedura per una wiki.
guarda se guesta registrazione ti è di aiuto
Immagine
korda
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1720
Iscrizione: giovedì 24 dicembre 2020, 15:58

Re: Configurare Gmail per log (OAuth2.0)

Messaggio da korda »

Ok... per Other si intende quindi App Desktop...

Lunedì ci proverò, grazie ancora @rai :birra:
Io non sono Bagheera né Akela, io non frequento la Rupe.
Io sono Kaa: faccio ballare le scimmie alle Tane Fredde.
rai
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2848
Iscrizione: domenica 11 maggio 2008, 18:03
Desktop: plasma
Distribuzione: 22.04
Località: Palermo

Re: Configurare Gmail per log (OAuth2.0)

Messaggio da rai »

È possibile che io lunedì abbia poco tempo disponibile, quindi mi porto avanti e ti posto un file contenente una serie di funzioni per usare le Gmail API (acquisizione credenziali, lettura, invio)
Per usare le funzioni contenute in questo modulo bisogna personalizzare le costanti:

Codice: Seleziona tutto

SCOPES = l'ambito di autorizzazioni che vuoi ottenere

CLIENT_SECRETS = il file delle credentiali salvate quando hai cliccato "Download JSON"
API_ACCESS_TOKEN = il file dove viene salvato il token quando l'utente ha dato il consenso
DOWNLOAD_DIR = la cartella in cui voglio scaricati gli allegati
Ho aggiunto alla fine una funzione korda() che ti permette di usare il file come se fosse uno script che invia una mail dal tuo account Gmail
Anche qui devi personalizzare le costanti TO, SENDER, SUBJECT, msgHtml, msgPlain, attachments
Per usarlo come script:

Codice: Seleziona tutto

$ python3 /path/gmail_API_korda
Io non lo uso così ma eventualmente si può implementare nello script la capacità di leggere la riga di comando per acquisire dei parametri (destinatari, oggetto, percorso di allegati, etc)

Buon weekend

EDIT aggiornato l'allegato
Allegati
gmail_API_korda.txt
(12.76 KiB) Scaricato 34 volte
Ultima modifica di rai il giovedì 14 aprile 2022, 12:25, modificato 1 volta in totale.
korda
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1720
Iscrizione: giovedì 24 dicembre 2020, 15:58

Re: Configurare Gmail per log (OAuth2.0)

Messaggio da korda »

Ti ringrazio infinitamente @rai per la disponibilità.

Appena possibile ti darò un feedback.

Grazie ancora per il momento, ti auguro un buon weekend
Io non sono Bagheera né Akela, io non frequento la Rupe.
Io sono Kaa: faccio ballare le scimmie alle Tane Fredde.
korda
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1720
Iscrizione: giovedì 24 dicembre 2020, 15:58

Re: Configurare Gmail per log (OAuth2.0)

Messaggio da korda »

Alla fine sono stato vinto dalla curiosità e ho voluto fare una prova di anteprima sul mio PC di casa. Prima di mettere il [Risolto] avrei un'ultima domanda: devo creare un client_secret per ogni device che aggancio, non è vero?

Nel frattempo posto qui il riepilogo dei commenti qui sopra, più qualche accorgimento che ho incontrato :ciao:

Codice: Seleziona tutto

A) CONFIOGURARE GOOGLE CLOUD PLATFORM

    1. Accedere, con il proprio account Google, su https://console.developers.google.com/

    2. Al primo accesso verra' richiesto di creare un progetto in cui definire API e app

    3. Abilitare le API necessarie (oltre a quelle gia' abilitate di default abilitare "Gmail API")

    4. Per le API come "Gmail API" si rende necessario abilitare una "Schermata di consenso OAuth"
    
        4.1. Se il device da configurare sara' un sistema headless (ad es. un RaspberryPI) sara' NECESSARIO
             definire un "utente di prova" (lo stesso account Google puo' andar bene)
    
    5. Anndare nella sezione "Credenziali" e creare una credenziale di tipo "OAuth 2.0 Client ID"

        5.1. Scaricare il file client_secret_foobarbaz.json



B) CONFIGURARE LA MACCHINA LOCALE

    1. Installare i moduli necessari:
        $ sudo apt install python3-pip
        $ pip3 install -U google-api-python-client oauth2client

    2. Editare lo script gmail_API.py, ridefinendo le seguenti costanti:
        SCOPES = l'ambito di autorizzazioni che vuoi ottenere (default: ["https://mail.google.com/"])
        CLIENT_SECRETS = il file delle credentiali scaricato al punto A)5.1.
        API_ACCESS_TOKEN = il file dove viene salvato il token quando l'utente avra' dato il consenso la prima volta
        DOWNLOAD_DIR = la cartella in cui voglio scaricati gli allegati

    3. Editare nella funzione korda() i vari parametri della mail da spedire (from, to, head, body, attachments)

    4. Lanciare una prima volta lo script per ottenere il token:

        4.1. $ python3 /path/gmail_API.py 
             nel caso ci si trovi su un device in cui sia possibile aprire un browser per grantare l'accesso
        
        4.2. $ python3 /path/gmail_API.py --noauth_local_webserver
             nel caso ci si trovi su un device headless: verra' fornito un link, per ottenere un codice di conferma, 
             a cui potranno accedere solo gli utenti definiti nel punto A)4.1.


REFERENCES:
https://forum.ubuntu-it.org/viewtopic.php?p=5293905 ("Configurare Gmail per log (OAuth2.0)")
https://stackoverflow.com/a/37267330 ("Sending email via Gmail & Python")
https://developers.google.com/workspace/guides/get-started
Io non sono Bagheera né Akela, io non frequento la Rupe.
Io sono Kaa: faccio ballare le scimmie alle Tane Fredde.
korda
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1720
Iscrizione: giovedì 24 dicembre 2020, 15:58

Re: Configurare Gmail per log (OAuth2.0)

Messaggio da korda »

Ho creato un altro client_secret per il RasPI qui in ufficio e funziona tutto.

Aggiungo che il token è personale per utente, il file .json del token scaricato ha attributi 600.

Mi manca solo da separare il modulo con le funzioni da uno script effettivo che manda la mail: ma è cosa con cui dovrei essere in grado di arrangiarmi.

Metto quindi il [Risolto].

Grazie ancora @rai, a buon rendere :birra:
Io non sono Bagheera né Akela, io non frequento la Rupe.
Io sono Kaa: faccio ballare le scimmie alle Tane Fredde.
rai
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2848
Iscrizione: domenica 11 maggio 2008, 18:03
Desktop: plasma
Distribuzione: 22.04
Località: Palermo

Re: [Risolto] Configurare Gmail per log (OAuth2.0)

Messaggio da rai »

Ho creato un altro client_secret per il RasPI qui in ufficio e funziona tutto.
non è un problema dato che G dà un certo numero di app disponibili gratuitamente, comunque non sarebbe stato necessario: basta copiare i file del client_secret e del token nell'altra installazione purchè non cambi l'account e gli ambiti di uso delle API
Nella mia esperienza, G non controlla fingerprint, IP o altro (infatti io nemmeno conoscevo l'opzione --noauth_local_webserver)
Mi manca solo da separare il modulo con le funzioni da uno script effettivo che manda la mail
In quel caso lo script dovrà importare dal modulo gmail_API.py le funzioni che usa. Per poterlo fare devi dire a python dove si trova quel modulo, per esempio mettendo in ~/.profile una linea di questo tipo

Codice: Seleziona tutto

export PYTHONPATH=/percorso/alla/relativa/cartella
korda
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1720
Iscrizione: giovedì 24 dicembre 2020, 15:58

Re: [Risolto] Configurare Gmail per log (OAuth2.0)

Messaggio da korda »

rai ha scritto:
martedì 29 marzo 2022, 9:48
Ho creato un altro client_secret per il RasPI qui in ufficio e funziona tutto.
non è un problema dato che G dà un certo numero di app disponibili gratuitamente, comunque non sarebbe stato necessario: basta copiare i file del client_secret e del token nell'altra installazione purchè non cambi l'account e gli ambiti di uso delle API
Nella mia esperienza, G non controlla fingerprint, IP o altro (infatti io nemmeno conoscevo l'opzione --noauth_local_webserver)
Mi manca solo da separare il modulo con le funzioni da uno script effettivo che manda la mail
In quel caso lo script dovrà importare dal modulo gmail_API.py le funzioni che usa. Per poterlo fare devi dire a python dove si trova quel modulo, per esempio mettendo in ~/.profile una linea di questo tipo

Codice: Seleziona tutto

export PYTHONPATH=/percorso/alla/relativa/cartella
Sì, è quello che ho fatto, dal momento che tenere tutto in un unico file (le funzioni di autenticazione e lo script che manda effettivamente la mail) mi sembra poco versatile.

Devo aver pasticciato da qualche parte, visto che mi è arrivata una mail da Google riguardante un Tentativo di accesso bloccato (gli orari coincidevano al minuto con i crontab). Per sicurezza ho cambiato la password dell'account Google.

Credo che il cambio di password sull'account provochi la revoca dei token, difatti adesso ho un messaggio del tipo che il token era scaduto oppure era stato revocato. Ho fatto una reinizializzazione del token e tutto è tornato ok.

Tengo monitorata la situazione...
Io non sono Bagheera né Akela, io non frequento la Rupe.
Io sono Kaa: faccio ballare le scimmie alle Tane Fredde.
Avatar utente
vaeVictis
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4703
Iscrizione: venerdì 27 luglio 2012, 17:58
Desktop: Gnome
Distribuzione: Ubuntu 20.04 64bit

Re: [Risolto] Configurare Gmail per log (OAuth2.0)

Messaggio da vaeVictis »

Ciao, discussione interessante che ho seguito.
Giusto una osservazione, relativa al file di configurazione in cui aggiungere l'export.
La trovate qui, tanto con l'inglese non avete problemi :)
Pirates arrrrrrrrrrr awesome!!!
«I fear not the man who has practiced 10000 kicks once,
but I fear the man who has practiced one kick 10000 times.»
korda
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1720
Iscrizione: giovedì 24 dicembre 2020, 15:58

Re: [Risolto] Configurare Gmail per log (OAuth2.0)

Messaggio da korda »

vaeVictis ha scritto:
mercoledì 30 marzo 2022, 0:31
Ciao, discussione interessante che ho seguito.
Giusto una osservazione, relativa al file di configurazione in cui aggiungere l'export.
La trovate qui, tanto con l'inglese non avete problemi :)
Grazie del dettaglio, non ho ancora letto tutto quel 3d ma forse troverò la soluzione.

Nel caso specifico di questa discussione le variabili d'ambiente le esporto esplicitamente e direttamente dal bash script, che fa cose e poi richiama quello in python per mandare la mail di log. Questo perché, per motivi che devo ancora capire, crontab non carica le impostazioni del .bashrc dell'utente di turno :nono:
Io non sono Bagheera né Akela, io non frequento la Rupe.
Io sono Kaa: faccio ballare le scimmie alle Tane Fredde.
Avatar utente
vaeVictis
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4703
Iscrizione: venerdì 27 luglio 2012, 17:58
Desktop: Gnome
Distribuzione: Ubuntu 20.04 64bit

Re: [Risolto] Configurare Gmail per log (OAuth2.0)

Messaggio da vaeVictis »

È proprio per via degli stessi motivi per cui facevo la precisazione
Vedi anche qui.

Se non ne vieni a capo fai sapere, magari descrivendo per bene come lanci il tutto alla fine.
Pirates arrrrrrrrrrr awesome!!!
«I fear not the man who has practiced 10000 kicks once,
but I fear the man who has practiced one kick 10000 times.»
korda
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1720
Iscrizione: giovedì 24 dicembre 2020, 15:58

Re: [Risolto] Configurare Gmail per log (OAuth2.0)

Messaggio da korda »

vaeVictis ha scritto:
mercoledì 30 marzo 2022, 11:12
È proprio per via degli stessi motivi per cui facevo la precisazione
Vedi anche qui.

Se non ne vieni a capo fai sapere, magari descrivendo per bene come lanci il tutto alla fine.
In realtà è un non-problema visto che ho risolto così (questo è solo uno degli script crontabbati)

Codice: Seleziona tutto

#!/bin/bash
export LOGFILE="/opt/AutoUpgrade.log"  # file di log
export PATH=/opt:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:$PATH
export PYTHONPATH=/opt/gmail-sendlog

echo "*** AutoUpgrade from MELAMPO ***" > $LOGFILE
date >> $LOGFILE
apt-get update >> $LOGFILE
apt-get -y dist-upgrade >> $LOGFILE
apt-get autoclean >> $LOGFILE
apt-get -y autoremove >> $LOGFILE

# send log mail with Gmail
/opt/gmail-sendlog/logsender.py -f $LOGFILE

reboot
e questo è /opt/gmail-sendlog/logsender.py

Codice: Seleziona tutto

#!/usr/bin/python3

import sys, getopt

# importo il modulo per gestire OAuth 2.0 di Google
import gmail_API

def get_attachment():
    options, args = getopt.getopt(
        sys.argv[1:],
        'f:',
        ['file='])
    attachment = None
    for option_key, option_value in options:
        if option_key in ('-f', '--file'):
            attachment = option_value
    return attachment

def send_log():
    "Send a message with or without attachment(s)"
    
    GMAIL = gmail_API.get_GoogleServiceEndPoint('gmail', 'v1')
    
    TO = ["foobarbaz@gmail.com"] # it must be a list
    SENDER = "foonarbaz@gmail.com"
    SUBJECT = "MELAMPO'S LOGS"
    afile = get_attachment()
    attachments = [afile] # it must be a list, it can be empty []
    msgHtml = "Hello!<br/>MELAMPO has finished a job right now!<br/>Here there is attached the related log file."
    msgPlain = "Hello!\nMELAMPO has finished a job right now!\nHere there is attached the related log file."
    
    gmail_API.send(GMAIL,
         SENDER,
         TO,
         SUBJECT,
         msgHtml,
         msgPlain,
         attachments
         ) 

if __name__ == '__main__':
    send_log()
Io non sono Bagheera né Akela, io non frequento la Rupe.
Io sono Kaa: faccio ballare le scimmie alle Tane Fredde.
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 7 ospiti