2015-10-27 8 views
5

Sto eseguendo uno script di app Google con la mia app C# circa una volta ogni 1,5 minuti. Lo script app sposta il contenuto tra fogli di lavoro e fogli di modifica. Utilizzo anche l'API di Drive.L'autorizzazione del servizio API di esecuzione script di Google app fallisce una volta all'ora

Il mio script funziona bene per lunghi periodi, tranne per il fatto che ottengo un errore di autorizzazione per 5 minuti ogni ora.

Ecco il mio codice che gestisce l'autorizzazione:

class Authentication 
{ 

    public static ScriptService ScriptsAuthenticateOauth(UserCredential credential) 
    { 
     try 
     { 

      ScriptService service = new ScriptService(new BaseClientService.Initializer() 
      { 
       HttpClientInitializer = credential, 
       ApplicationName = "MyApp", 
      }); 

      return service; 
     } 
     catch (Exception ex) 
     { 
      Console.WriteLine(DateTime.Now.ToString("HH:mm") + ": An authentication error occurred: " + ex.InnerException); 
      return null; 
     } 

    } 


    public static UserCredential getCredential(string clientId, string clientSecret, string userName) 
    { 

     string[] scopes = new string[] { DriveService.Scope.Drive, // view and manage your files and documents 
             DriveService.Scope.DriveAppdata, // view and manage its own configuration data 
             DriveService.Scope.DriveAppsReadonly, // view your drive apps 
             DriveService.Scope.DriveFile, // view and manage files created by this app 
             DriveService.Scope.DriveMetadataReadonly, // view metadata for files 
             DriveService.Scope.DriveReadonly, // view files and documents on your drive 
             DriveService.Scope.DriveScripts, // modify your app scripts 
             ScriptService.Scope.Drive, 

             "https://www.googleapis.com/auth/spreadsheets", 
             "https://spreadsheets.google.com/feeds", 
             "https://docs.google.com/feeds"}; 
     return GoogleWebAuthorizationBroker.AuthorizeAsync(new ClientSecrets { ClientId = clientId, ClientSecret = clientSecret } 
                         , scopes 
                         , userName 
                         , CancellationToken.None 
                         , new FileDataStore("Google.Sheet.Sync.Auth.Store")).Result; 
    } 

    public static DriveService DriveAuthenticateOauth(UserCredential credential) 
    { 
     try 
     { 


      DriveService service = new DriveService(new BaseClientService.Initializer() 
      { 
       HttpClientInitializer = credential, 
       ApplicationName = "MyApp", 
      }); 

      // Console.WriteLine("Auth success"); 


      return service; 
     } 
     catch (Exception ex) 
     { 

      // Console.WriteLine(ex.InnerException); 
      Console.WriteLine(DateTime.Now.ToString("HH:mm") + ": An authentication error occurred: " + ex.InnerException); 
      return null; 

     } 

    } 
} 

ottengo i miei servizi come questo:

var credential = Authentication.getCredential(CLIENT_ID, CLIENT_SECRET, Environment.UserName); 
DriveService driveService = Authentication.DriveAuthenticateOauth(credential); 
ScriptService scriptService = Authentication.ScriptsAuthenticateOauth(credential); 

Ma verso la fine dell'ora, la chiamata Apps Script tiri il seguente errore:

Script error message: Authorization is required to perform that action. 

Giusto per essere chiari, funziona in tutte le altre volte, solo non in quei 5 minuti n ascolta la fine dell'ora. Ho attivato l'API di Google Drive su entrambe le console degli sviluppatori e in Risorse> Servizi Google avanzati ... nell'editor degli script di app.

Quindi cosa sta succedendo? Questo può essere risolto?

+1

sembra che tu stia passando un token di accesso scaduto. in tal caso, leggi su oauth2 e su come gestire i token di aggiornamento e accesso. –

risposta

2

Dopo aver effettuato ulteriori ricerche, ho trovato che lo script doveva solo essere eseguito da Script Editor per evitare questo errore. Si tratta di informazioni che ho trovato:

Authorization is required to perform that action.

This error indicates that the script is lacking the authorization needed to run. When a script is run in the Script Editor or from a custom menu item an authorization dialog is presented to the user. However, when a script is run as a service, embedded with a Google Sites page, or run from a trigger the dialog cannot be presented and this error is shown. To authorize the script, open the Script Editor and run any function. To avoid this error, remember to run the script once in the Script Editor after adding new services or capabilities to your script.

Fonte: https://developers.google.com/apps-script/troubleshooting#common_errors

Un altro miglioramento relativo che ho fatto per il mio codice, era per andare a prendere una nuova copia delle credenziali di oggetto prima di creare ciascuno dei 2 servizi: in altre parole, ho cambiato questo:

var credential = Authentication.getCredential(CLIENT_ID, CLIENT_SECRET, Environment.UserName); 
DriveService driveService = Authentication.DriveAuthenticateOauth(credential); 
ScriptService scriptService = Authentication.ScriptsAuthenticateOauth(credential); 

a questo:

var credential = Authentication.getCredential(CLIENT_ID, CLIENT_SECRET, Environment.UserName); 
DriveService driveService = Authentication.DriveAuthenticateOauth(credential); 
credential = Authentication.getCredential(CLIENT_ID, CLIENT_SECRET, Environment.UserName); 
ScriptService scriptService = Authentication.ScriptsAuthenticateOauth(credential); 

Questo da solo non ha risolto il mio problema, ma aiuta a evitare i quirk di OAuth e può impedire l'aggiornamento di token non necessari.

0

Probabilmente è necessario un token di aggiornamento. I token di accesso sono impostati per la durata di soli 3600 (1 ora) generalmente da Google, mentre il token di aggiornamento è molto più lungo ed è progettato per consentire di ottenere facilmente un nuovo token di accesso quando scade quello precedente. Questo può essere un buon punto di partenza: Google API .NET Client information on token responses

Inoltre, se non si dispone di un token di aggiornamento, ma si dispone di un token di accesso, è possibile revocare il token di accesso precedente e quindi eseguire di nuovo l'autenticazione. La nuova risposta avrà un token di aggiornamento, se correttamente chiamato "assicurarsi che si stanno ottenendo un tipo di token "Bearer").

Ci sono più informazioni su come utilizzare i gettoni di aggiornamento che vivono più a lungo here.

0

Se l'applicazione non riesce" solo in quei 5 minuti vicino alla fine dell'ora ", probabilmente stai incontrando this bug with the execution API.

Apparentemente, le richieste all'API di esecuzione con un token che scadrà entro 6 minuti danno errori" Autorizzazione richiesta ... ". Questo sembra essere collegato al fatto che 6 minuti è il tempo di esecuzione massimo di uno script.

Una soluzione è aggiornare il token in anticipo, se si sa quando scadrà (che non è il caso su Android). Speriamo che il bug verrà risolto presto.

Non sono sicuro di essere riuscito a risolvere il problema o se hai appena trovato una buona soluzione alternativa, ma potresti decidere di risolvere il problema di Apps Script in modo che possa essere risolto prima.

Problemi correlati