Personal tools
Google api authentication: connettersi tramite un service account

keep in touch with your API

Jul 15, 2015

Google api authentication: connettersi tramite un service account

Connettersi ai servizi di google esposti tramite API me lo ricordavo veramente semplice. In effetti era da un bel po' che non avevo bisogno di farlo

Mi è già capitato altre volte di dovermi connettere alle API di google per leggere dati relativi ai suoi servizi. È sempre stato tutto molto semplice: autenticazione tramite un account gmail e accesso ai dati! Solamente una mail e relativa password.

Ora, ripetere questo processo è stato leggermente più complesso poiché l'autenticazione è cambiata, passando ad OAuth 2.0, e purtroppo la documentazione presente su developers.google.com l'ho trovata non sempre precisa, probabilmente a causa delle continue modifiche che vengono apportate alle librerie.

Vediamo come potersi connettere velocemente.

Preparare un account su google

La prima cosa da fare per poter utilizzare le API in modo autenticato è "avvisare" google delle proprie intenzioni. È necessario andare sulla console di sviluppo e creare un nuovo progetto:

googleconsole1

 

Una volta all'interno del progetto è necessario scegliere nel menù laterale la voce API e da lì abilitare i servizi che si vogliono utilizzare:

 

googleconsole2

 

Da questo pannello è possibile verificare anche lo stato di utilizzo delle API scelte: Google generalmente concede (gratuitamente o a tariffe pattuite) una certa quota di utilizzo, che da qui può venire monitorata. Con i servizi che ho utilizzato fino ad ora c'è la possibilità di eseguire fino a 50,000 request al giorno, gratuitamente.

Dopo aver gestito le varie abilitazioni si deve navigare alla voce credentials e preparare un service account per ottenere i dati tramite cui fare autenticazione via codice. Creiamo quindi nuovo client ID:

 

googleconsole3

 

Durante il processo di creazione ci verrà chiesto di indicare che tipo di servizio si sta implementando (e qui dovremo indicare la voce Service Account) e che tipo di chiave intendiamo generare per proteggere la connessione (possiamo generare una chiave p12).

Al termine di questa fase sarà stato generato il client ID e verrà scaricata automaticamente sul computer la chiave p12 associata alle credenziali create. Apparirà inoltre un pop-up, nel quale si potrà leggere la password associata alla chiave.

Vediamo il codice

Quando ho iniziato con le prove mi sono reso conto che il codice nella documentazione di google non era coerente con la versione del software che stavo utilizzando (google-api-python-client). Le cose sono andate molto meglio nel momento in cui ho cominciato a lavorare con la versione del sofware disponibile su github; ad ogni modo il codice è stato recentemente rilasciato su pypi alla sua versione più recente!

Vediamo un esempio concreto. Supponiamo di volerci autenticare ad analytics e leggere le pageviews di una pagina. Prima di tutto gestiamo la connessione al servizio:


client_email = "xxxxxxxxx@developer.gserviceaccount.com" p12_file = "%s/privatekey.p12" % os.path.dirname(os.path.abspath(__file__)) try: with open(p12_file) as f: private_key = f.read() credentials = SignedJwtAssertionCredentials(client_email, private_key, "https://www.googleapis.com/auth/analytics.readonly") http_auth = credentials.authorize(Http()) service = build("analytics", "v3", http=http_auth) except client.AccessTokenRefreshError: print ("There was an error obtaining the access")
 

Qui dobbiamo utilizzare l'email address ottenuto durante la creazione del nuovo client ID nella console di sviluppo di google.

Per creare le credenziali di connessioni si dovrà utilizzare la chiave p12 generata durante la registrazione del progetto.

Un problema che si potrebbe riscontrare è il seguente:

    
'PKCS12 format is not supported by the PyCrypto library. ' NotImplementedError: PKCS12 format is not supported by the PyCrypto library.
Try converting to a "PEM"
(openssl pkcs12 -in xxxxx.p12 -nodes -nocerts > privatekey.pem)
or using PyOpenSSL if native code is an option.

La mia installazione non riesce ad utilizzare la chiave p12 per autenticare le richieste. Il suggerimento però è chiaro: è possibile convertire la chiave in una chiave pem.

Ora la connessione al servizio funziona, ed è possibile interrogare le API di google:


client_email = "xxxxxxxxx@developer.gserviceaccount.com" pem_file = "%s/privatekey.pem" % os.path.dirname(os.path.abspath(__file__)) try: with open(pem_file) as f: private_key = f.read() credentials = SignedJwtAssertionCredentials(client_email, private_key, "https://www.googleapis.com/auth/analytics.readonly") http_auth = credentials.authorize(Http()) service = build("analytics", "v3", http=http_auth) except client.AccessTokenRefreshError: print ("There was an error obtaining the access")
  data = service.data().ga().get(ids='ga:xxxxxxx', start_date='2010-01-01', end_date=datetime.today().strftime('%Y-%m-%d'), metrics='ga:pageviews', filters='ga:pagePath=='/xxx/xxx/xxx/xxx')
result = data.execute()

La chiamata non è velocissima: dopo tutto stiamo chiedendo ad analytics il numero di visualizzazioni di una pagina per un periodo relativamente lungo. Però al termine dell'esecuzione di questo script, dentro result ci saranno tutte le informazioni restituite dalla chiamata all'API.

 

Come si può vedere, non si tratta di un processo particolarmente difficoltoso. Rispetto ad una semplice autenticazione con nome utente e password c'è da fare qualche passaggio in più, ma nulla di impegnativo! Il problema più grosso per me è stato trovare una versione adatta della libreria python per poter effettuare le chiamate.

Filed under: , ,
comments powered by Disqus