Come posso integrare le API di Google Calendar con Python senza usare credenziali locali?

👤 Iniziato da @honorsacchi42
📅 20/09/2025 09:00
📁 Programmazione 🌐 IT
Avatar di honorsacchi42
Ciao a tutti, sono un po' bloccato e spero che qualcuno possa darmi una mano. Sto cercando di integrare le API di Google Calendar in un'applicazione Python che gira su un server senza interfaccia grafica, quindi non posso usare il flusso di autenticazione che richiede l'intervento manuale dell'utente (copia e incolla del codice di autorizzazione).

Ho provato a usare le credenziali di servizio (service account) seguendo la documentazione di Google, ma non riesco a far funzionare tutto correttamente. Il problema principale è che quando cerco di accedere al calendario specifico dell'utente, mi viene negato l'accesso.

Ecco un frammento del codice che sto usando (Python 3.9):

```python
from google.oauth2 import service_account
from googleapiclient.discovery import build

SCOPES = ['https://www.googleapis.com/auth/calendar']
SERVICE_ACCOUNT_FILE = 'path/to/service_account.json'

creds = service_account.Credentials.from_service_account_file(
SERVICE_ACCOUNT_FILE, scopes=SCOPES)

service = build('calendar', 'v3', credentials=creds)

# Call the Calendar API
now = datetime.datetime.utcnow().isoformat() + 'Z' # 'Z' indicates UTC time
events_result = service.events().list(
calendarId='primary', # oppure l'ID del calendario specifico
timeMin=now,
maxResults=10,
singleEvents=True,
orderBy='startTime').execute()

events = events_result.get('items', [])

print(events)
```

L'errore che ricevo è: `googleapiclient.errors.HttpError: <HttpError 403 when requesting ... returned "Forbidden">`

So che devo condividere il calendario con l'account di servizio, ma l'ho già fatto e ancora non funziona. Ho anche abilitato l'API Google Calendar nel progetto GCP associato all'account di servizio.

Qualcuno ha avuto esperienze simili e sa come risolvere questo problema? Esiste un modo migliore per autenticarsi senza dover usare credenziali locali o oauth2client.file.Storage? Grazie in anticipo per qualsiasi consiglio!

Aggiornamento: ho anche provato a usare un account di servizio con delega a livello di dominio (Domain-Wide Delegation), ma non sono sicuro di aver configurato tutto correttamente. Forse è lì il problema?
Avatar di eugeniagentile60
Il problema principale qui è l'autenticazione con l'account di servizio e l'accesso al calendario specifico dell'utente. Hai fatto bene a provare con la delega a livello di dominio (Domain-Wide Delegation), ma devi configurarla correttamente.

Quando utilizzi un account di servizio con delega a livello di dominio, devi specificare l'utente che vuoi impersonare utilizzando il parametro `subject` durante la creazione delle credenziali. Ad esempio:

```python
creds = service_account.Credentials.from_service_account_file(
SERVICE_ACCOUNT_FILE, scopes=SCOPES, subject='[email protected]')
```

Sostituisci `'[email protected]'` con l'indirizzo email dell'utente di cui vuoi accedere al calendario.

Inoltre, assicurati di aver abilitato l'API Google Calendar e di aver configurato correttamente i permessi dell'account di servizio nella console Google Cloud.

Se continui ad avere problemi, verifica che l'ID del calendario specificato nella richiesta `events().list()` sia corretto. Se stai usando `'primary'`, assicurati che l'utente impersonato abbia un calendario primario configurato.

In ogni caso, se non hai ancora risolto, prova a stampare l'errore completo per avere più dettagli sul problema: `print(events_result)`.
Avatar di honorsacchi42
Ciao @eugeniagentile60, grazie mille per la dritta super precisa! La parte del `subject` mi era sfuggita completamente, stavo impazzendo! Controllerò subito se ho configurato tutto correttamente nella Google Cloud Console, perché magari è lì che sta il problema. Anche il consiglio di stampare l'errore completo è ottimo, non ci avevo pensato. Appena ho un attimo mi metto a smanettare e vi faccio sapere se risolvo. Spero di venirne a capo! Grazie ancora per l'aiuto.

La Tua Risposta

💬

Vuoi partecipare alla discussione?

Accedi o registrati per scrivere la tua risposta e unirti alla conversazione!