2015-10-27 3 views
5

Ich führe ein Google Apps-Skript mit meiner C# App etwa alle 1,5 Minuten aus. Das Apps-Skript verschiebt Inhalte zwischen Tabellenkalkulationen und Bearbeitungsblättern. Ich benutze auch die Drive API.Google apps Skriptausführung API-Dienst Autorisierung schlägt einmal pro Stunde fehl

Mein Skript läuft über lange Zeiträume, außer für die Tatsache, dass ich eine Autorisierungsfehler für 5 Minuten jede Stunde bekomme.

Hier ist mein Code, die Zulassung behandelt:

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; 

     } 

    } 
} 

ich so meine Dienste erhalten:

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

Aber um das Ende der Stunde, wirft der apps Skriptaufruf folgende Fehlermeldung:

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

Nur um klar zu sein, es funktioniert zu allen anderen Zeiten, nur nicht in diesen 5 Minuten n Ohr das Ende der Stunde. Ich habe Google Drive API sowohl auf meiner Entwicklerkonsole als auch unter Ressourcen> Erweiterte Google-Dienste im Apps-Skript-Editor aktiviert.

Also, was ist los? Kann das behoben werden?

+1

scheint, dass Sie ein abgelaufenes Zugriffs-Token übergeben. Wenn ja, lesen Sie über oauth2 und wie man mit Refresh- und Access-Token umgeht. –

Antwort

2

Nach weiteren Recherchen fand ich, dass das Skript nur aus dem Skript-Editor ausgeführt werden musste, um diesen Fehler zu vermeiden. Dies ist die Informationen, die ich gefunden:

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.

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

Eine weitere ähnliche Verbesserung, die ich auf meinen Code gemacht, war eine neue Kopie der Anmeldeinformationen Objekt zu holen, bevor jeder der 2-Dienste zu schaffen: In anderen Worte, änderte ich dies:

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

dazu:

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); 

Das hat mein Problem nicht behoben, aber es hilft beim Vermeiden von OAuth-Macken und kann unnötige Token-Aktualisierungen verhindern.

0

Sie benötigen wahrscheinlich ein Aktualisierungstoken. Zugriffstoken sind auf eine durchschnittliche Lebensdauer von nur 3600 Stunden (1 Stunde) festgelegt, während das Aktualisierungstoken wesentlich länger dauert. Es ist so konzipiert, dass Sie problemlos ein neues Zugriffstoken erhalten, wenn das vorherige abgelaufen ist. Dies kann ein guter Ausgangspunkt sein: Google API .NET Client information on token responses

Wenn Sie kein Aktualisierungstoken haben, aber über ein Zugriffstoken verfügen, können Sie das vorherige Zugriffstoken widerrufen und anschließend erneut authentifizieren. Die neue Antwort wird ein Aktualisierungs-Token haben, wenn sie richtig genannt „stellen Sie sicher, einen "Bearer" Token-Typ erhalten.)

Es gibt mehr Informationen über die längeren lebenden Refresh-Token here.

0

Wenn Ihre Anwendung nicht“ nur in diesen 5 Minuten gegen Ende der Stunde ", sind Sie höchstwahrscheinlich .

Anscheinend Anfragen an die Ausführung API mit einem Token, das innerhalb von 6 Minuten abläuft geben" Autorisierung ist erforderlich ... "Fehler. Dies scheint mit der Tatsache verbunden zu sein, dass 6 Minuten die maximale Laufzeit eines Skripts sind.

Eine Problemumgehung besteht darin, Ihr Token im Voraus zu aktualisieren, wenn Sie wissen, wann es abläuft (was bei Android nicht der Fall ist). Hoffentlich wird der Fehler bald behoben sein.

Ich bin mir nicht sicher, ob es Ihnen gelungen ist, Ihr Problem wirklich zu beheben, oder ob Sie gerade eine gute Problemumgehung gefunden haben.