2013-10-29 21 views
5

Ich habe versucht, einen DriveService zu erstellen, indem ich ein Dienstkonto verwende, das im Auftrag eines anderen Benutzers handelt.AssertionFlowClient sinkt, versucht ServiceAccountCredential zu verwenden, aber es funktioniert nicht

ich kopiert habe dieser Code von Google Dokumentation hier https://developers.google.com/drive/delegation

static DriveService BuildService() { 
      X509Certificate2 certificate = new X509Certificate2(SERVICE_ACCOUNT_PKCS12_FILE_PATH, "notasecret", X509KeyStorageFlags.Exportable); 
     var provider = new AssertionFlowClient(GoogleAuthenticationServer.Description, certificate) 

     { 
      ServiceAccountId = SERVICE_ACCOUNT_EMAIL, 
      Scope = DriveService.Scopes.Drive.GetStringValue(), 
     }; 
     var auth = new OAuth2Authenticator<AssertionFlowClient>(provider, AssertionFlowClient.GetState); 
     return new DriveService(auth); 
    } 

aber ich bekomme diese Warnung bei dem Versuch, das Projekt zu erstellen:

Warning 4 ‚Google.Apis.Authentication.OAuth2. DotNetOpenAuth.AssertionFlowClient 'ist veraltet:' AssertionFlowClient wird nicht mehr unterstützt und wird in 1.7.0-beta entfernt. Erwägen Sie, ServiceAccountCredential aus dem neuen Google.Apis.Auth NuGet-Paket zu verwenden. '

und ich bekomme auch diesen Fehler:

Fehler 11 Argument 1: Konvertierung von 'Google.Apis.Authentication.OAuth2.OAuth2Authenticator' auf 'Google.Apis.Services.BaseClientService.Initializer'

dann googeln ich ServiceAccountCredential und endete mit diesem Code nach oben (auf dieser Seite abgeleitet: https://code.google.com/p/google-api-dotnet-client/wiki/OAuth2#Service_Accounts)

static DriveService BuildService() { 
      X509Certificate2 certificate = new X509Certificate2(SERVICE_ACCOUNT_PKCS12_FILE_PATH, "notasecret", X509KeyStorageFlags.Exportable); 

     ServiceAccountCredential credential = new ServiceAccountCredential(
      new ServiceAccountCredential.Initializer(SERVICE_ACCOUNT_EMAIL) 
      { 
       User = "[email protected]", 
       Scopes = new[] { DriveService.Scope.DriveFile } 
      }.FromCertificate(certificate)); 

     var service = new DriveService(new BaseClientService.Initializer() 
     { 
      HttpClientInitializer = credential, 
      ApplicationName = "Drive API Sample", 
     }); 

     return service; 
    } 

wenn ich versuche, diesen Code zu bauen alles in Ordnung scheint, aber wenn ich es laufen bekomme ich folgende Fehler.

Eine erste Chance Ausnahme des Typs 'System.Security.Cryptography.CryptographicException' ist in mscorlib.dll aufgetreten

Zusätzliche Informationen: Det att hitta det begärda objektet går inte. (Übersetzt: Das angeforderte Objekt kann nicht gefunden werden)

Wenn es einen Handler für diese Ausnahme gibt, kann das Programm sicher fortgesetzt werden.

Der Fehler tritt auf dieser Linie:

X509Certificate2 certificate = new X509Certificate2(SERVICE_ACCOUNT_PKCS12_FILE_PATH, "notasecret", X509KeyStorageFlags.Exportable); 

Wer irgendwelche Ideen?

-Update 2013 31. Oktober Ich habe diesen Code versucht:

{ 
     Console.WriteLine("Drive API - Service Account"); 
     Console.WriteLine("=========================="); 

     String serviceAccountEmail = "<some email>@developer.gserviceaccount.com"; 

     var certificate = new X509Certificate2(@"key.p12", "notasecret", X509KeyStorageFlags.Exportable); 

     ServiceAccountCredential credential = new ServiceAccountCredential(
      new ServiceAccountCredential.Initializer(serviceAccountEmail) 
      { 
       User = "<someuser>@<mydomain>.mygbiz.com", 
       Scopes = new[] { DriveService.Scope.Drive } 
      }.FromCertificate(certificate)); 

     // Create the service. 
     var service = new DriveService(new BaseClientService.Initializer() 
     { 
      HttpClientInitializer = credential, 
      ApplicationName = "DrvMgr", 
     }); 

     Console.WriteLine("Executing listing"); 
     FileList UserFiles = service.Files.List().Execute(); 

Ich bekomme diese Fehlermeldung:

Eine nicht behandelte Ausnahme des Typs 'Google.Apis.Auth.OAuth2.Responses.TokenResponseException' in Google.Apis.dll aufgetreten

Zusätzliche Informationen: Fehler: "access_denied", Beschreibung: "", Uri: ""

Antwort

0

Es sieht Wie der Pfad zu Ihrer p12-Datei ist falsch. Siehe das Plus.ServiceAccount Beispiel für eine funktionierende Lösung.

Ich denke, dass in diesem Beispiel die key.p12 als Inhaltsdatei zum Projekt hinzugefügt wurde, die immer in das Ausgabeverzeichnis kopiert wird. Wenn Sie dann den Dateipfad "key.p12" aus dem Code auswählen, wird diese Datei aus dem Ausgabeordner entnommen.

+0

Sorry, aber nein! Pfad ist markiert und alle oki (Ich habe es in C: \ temp \ key.p12) Und wenn ich die Zeile zu ändern: X509Certificate2 Zertifikat = neue X509Certificate2 (@ "C: \ temp \ key.p12", "notasecret", X509KeyStorageFlags.Exportable); der gleiche Fehler auftritt: Wenn ich den Pfad ändern, um zum Beispiel @ "C: \ tamp \ key.p12" bekomme ich eine andere Fehlermeldung mit der Nachricht: Eine erste Chance Ausnahme des Typs 'System.Security.Cryptography.CryptographicException' aufgetreten mscorlib.dll Zusätzliche Informationen: Det går inte att hitta sökvägen. (Übersetzt: "Pfad kann nicht gefunden werden") – JoBe

+0

Ich kann es immer noch nicht zur Arbeit bekommen. Könnte es eine Art Versionskonflikt sein? Auch der Link, den Sie in Ihrer Antwort angegeben haben, verwendet AssertionFlowClient, aber wie ich in meiner Frage erwähnt habe, erhalte ich eine Build-Warnung, dass er nicht mehr unterstützt wird. Fehle ich etwas? – JoBe

+0

Entschuldigung, versuchen Sie diesen Link - https://code.google.com/p/google-api-dotnet-client/source/browse/Plus.ServiceAccount/?repo=samples. Können Sie der README-Datei folgen und sicherstellen, dass dieses Beispiel wie erwartet funktioniert? Und nur um das zu überprüfen - haben Sie die Datei, die Sie von der Google API-Konsole heruntergeladen haben, an diesen Ort kopiert (C: \ Temp \ key.p12)? – peleyal

Verwandte Themen