5

Dove lavoro utilizziamo Google Apps for Work. Negli ultimi 9 mesi abbiamo utilizzato l'API di Gmail (~ 2000 richieste al giorno) per inserire nuove email per i nostri account di posta elettronica di supporto.L'API di Gmail ha improvvisamente smesso di funzionare con [Errore: client non autorizzato]

Questo è il modo in cui originariamente configurarlo:

  1. Vai https://console.developers.google.com/project/
  2. Cliccare sul progetto (o crearne uno nuovo)
  3. Clicca sulle API & Auth
  4. Cliccare sulla Credenziali
  5. Fare clic su Crea nuovo ID cliente
  6. Fare clic su Account servizio
  7. Scaricare un JWT (json) per l'account.
  8. Seguire il node.js quickstart guide con un token di tipo installato/nativo per lo stesso account e autorizzarlo tramite la console. I token JWT non funzionavano a meno che non avessimo fatto questo passaggio, una volta per ogni account.

Abbiamo fatto questo per ciascuno dei nostri account di posta elettronica di supporto individuali per evitare di dover attivare la delega a livello di dominio per nessuno di essi nella console di amministrazione. Siamo stati quindi in grado di autenticare con i gettoni con il supportato ufficialmente npm biblioteca googleapis, simile a questo:

var google = require('googleapis'); 

var jwtClient = new google.auth.JWT(
    token.client_email, 
    null, 
    token.private_key, 
    ['https://www.googleapis.com/auth/gmail.readonly'], 
    '[email protected]' 
); 

jwtClient.authorize(function(err, tokens) { 
    if (err) { 
     return cb(err); 
    } 

    var gmail = google.gmail('v1'); 
    var requestOptions = { 
     auth: jwtClient, 
     userId: 'me', 
     id: messageId, 
     format: 'raw' 
    }; 

    gmail.users.messages.get(requestOptions, function(err, response) { 
     if (err) { 
      return cb(err); 
     } 
     // do stuff with the response 
    }); 
}); 

Come ho detto, abbiamo utilizzato questo per lungo tempo e mai avuto nessun problema. Ieri intorno alle 10:00, tutti gli account hanno smesso di essere in grado di autenticarsi allo stesso tempo, con jwtClient.authorize() che restituisce improvvisamente l'errore [Error: unauthorized_client].

Ho provato a fare la stessa cosa con un nuovo token su un nuovo account di servizio (l'interfaccia web per ottenere il token è cambiato un po 'negli ultimi 9 mesi) e restituisce lo stesso errore.

La versione di googleapis che stavamo usando era 0.9.7, ma non possiamo ottenere l'autenticazione JWT a lavorare sulla nuova versione sia.

Abbiamo aperto un ticket con il team di assistenza di Google API, ma la persona di supporto con cui abbiamo parlato non aveva mai letto le specifiche dell'API di Gmail e alla fine non ci è stata in grado di aiutarci, quindi ci ha reindirizzato qui per entrare in contatto con il API engineering support team.

Abbiamo notato che l'autenticazione funziona se abilitiamo l'ambito per la delega a livello di dominio nella console di amministrazione, ma preferiremmo non farlo. Non abbiamo bisogno di impersonare gli account e preferiremmo utilizzare una singola JWT per ogni account.

+0

Non affiliato con Google, quindi basta scattare qui al buio :) I [consigli di scadenza] (https://developers.google.com/identity/protocols/OAuth2#expiration) danno un indizio? 'Un token potrebbe smettere di funzionare per uno di questi motivi: il token non è stato utilizzato per sei mesi. Potrebbe essere? – Tholle

+2

@Tholle, grazie per il suggerimento. Ho esaminato l'elenco delle ragioni e non credo che siano applicabili. Tutti gli account hanno smesso di funzionare esattamente nello stesso momento e non abbiamo cambiato le password o l'accesso revocato e sono tutti account di servizio, quindi non dovrebbero essere limitati a 25 token di aggiornamento. Per quanto riguarda l'utilizzo, tutti i conti/token vengono utilizzati quotidianamente. – brismuth

+1

Ho anche provato a ricevere nuovi token e otteniamo lo stesso errore. – brismuth

risposta

2

Si scopre che il flusso di autenticazione che stavamo utilizzando non è mai stato supportato e probabilmente è stato interrotto a causa di un bugfix da parte di Google.

Nella domanda commenti @Brandon Jewett-Hall e @Steve Bazyl si consiglia di utilizzare lo installed app auth flow invece, in quanto consente un aggiornamento indefinito di token di accesso ed è supportato.

Ulteriori informazioni sui diversi flussi di autenticazione sono disponibili nello Google API docs.

Problemi correlati