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?
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?