2013-10-29 15 views
5

Ho provato a creare un DriveService utilizzando l'account di servizio che agisce per conto di un altro utente.AssertionFlowClient depreceated, cercando di utilizzare ServiceAccountCredential, ma non funzionerà

Ho copiato il codice dalla documentazione Google ha trovato qui 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); 
    } 

ma ottengo questo avvertimento quando si cerca di costruire il progetto:

Attenzione 4 'Google.Apis.Authentication.OAuth2. DotNetOpenAuth.AssertionFlowClient 'è obsoleto:' AssertionFlowClient non è più supportato e verrà rimosso in 1.7.0-beta. Prendi in considerazione l'utilizzo di ServiceAccountCredential dal nuovo pacchetto Google.Apis.Auth NuGet. "

e ho anche ottenere questo errore:

Errore 11 Argomento 1: non può convertire da 'Google.Apis.Authentication.OAuth2.OAuth2Authenticator' a 'Google.Apis.Services.BaseClientService.Initializer'

poi ho googled ServiceAccountCredential e finito con questo codice (derivato da questa pagina: 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; 
    } 

quando provo a costruire questo codice sembra tutto bene, ma quando l'eseguo ottengo il seguente errore.

Una prima eccezione di possibilità di tipo 'System.Security.Cryptography.CryptographicException' in mscorlib.dll

Ulteriori informazioni: Det går inte att hitta det begärda objektet. (Tradotto: l'oggetto richiesto non può essere trovato)

Se esiste un gestore per questa eccezione, il programma può essere continuato in modo sicuro.

l'errore si verifica su questa linea:

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

Qualcuno ha qualche idea?

Aggiornamento 2013 31 ottobre ho provato questo codice:

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

ottengo questo messaggio di errore:

un'eccezione non gestita di tipo 'Google.Apis.Auth.OAuth2.Responses.TokenResponseException' si è verificato in Google.Apis.dll

Ulteriori informazioni: Errore: "ACCESS_DENIED", Descrizione: "", Uri: ""

risposta

0

Si guarda come il percorso del tuo file p12 non è corretto. Vedere l'esempio Plus.ServiceAccount per una soluzione funzionante.

Penso che in questo esempio, il key.p12 sia stato aggiunto al progetto come un file di contenuto che viene sempre copiato nella directory di output. Quindi menzionare il percorso del file "key.p12" dal codice risulterà nell'acquisizione di questo file dalla cartella di output.

+0

Siamo spiacenti, ma no! Il percorso è controllato e tutto oki (l'ho messo in C: \ temp \ key.p12) E quando cambio la linea a: certificato X509Certificate2 = nuovo X509Certificate2 (@ "C: \ temp \ key.p12", "notasecret", X509KeyStorageFlags.Exportable); si verifica lo stesso errore: Se modifico il percorso ad esempio @ "C: \ tamp \ key.p12" Ricevo un altro messaggio di errore che dice: Una prima eccezione di tipo "System.Security.Cryptography.CryptographicException" si è verificata in mscorlib.dll Ulteriori informazioni: Det går inte att hitta sökvägen. (tradotto: "Impossibile trovare il percorso") – JoBe

+0

Non riesco ancora a farlo funzionare. Potrebbe essere una sorta di disallineamento della versione? Inoltre, il link che hai fornito nella tua risposta utilizza AssertionFlowClient, ma come ho accennato nella mia domanda ottengo un avviso di build che non è più supportato. Mi sto perdendo qualcosa? – JoBe

+0

Siamo spiacenti, prova questo link: https://code.google.com/p/google-api-dotnet-client/source/browse/Plus.ServiceAccount/?repo=samples. Puoi seguire il file README e verificare che questo esempio funzioni come previsto? E .. solo per verificare: hai copiato il file scaricato dalla Console dell'API di Google in questa posizione (C: \ Temp \ key.p12)? – peleyal

Problemi correlati