6

Ho bisogno di usare SpreadsheetsService, ma non trovo il modo nella documentazione ufficiale .net. https://developers.google.com/google-apps/spreadsheets/?hl=ja#authorizing_requestsCome utilizzare SpreadsheetsService autenticato da ServiceAccountCredential?

ho il mio servizio autenticato:

String serviceAccountEmail = "[email protected]"; 

var certificate = new X509Certificate2(@"privatekey.p12", "pass", X509KeyStorageFlags.Exportable); 

ServiceAccountCredential credential = new ServiceAccountCredential(
    new ServiceAccountCredential.Initializer(serviceAccountEmail) 
    { 
     Scopes = new[] { DriveService.Scope.Drive } 
    }.FromCertificate(certificate)); 

Da qui posso istanziare quasi tutti i servizi.

Per esempio Drive Service:

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

Ma con SpreadsheetsService posso fare questo, perché SpreadsheetsService attendere una stringa 'nome dell'applicazione' nel suo costruttore di default o un GOAuth2RequestFactory nella sua proprietà RequestFactory.

Come autenticare SpreadsheetsService con un ServiceAccountCredential?

+1

Con Java si ca n uso: spreadsheetService.setHeader ("Autorizzazione", "Portatore" + accessToken); Ma non sono sicuro di .net .... esempio setHeader: http://stackoverflow.com/questions/15084133/issue-with-oauth2-authentication-with-google-spreadsheet/15152682#15152682 – eddyparkinson

+0

Hai trovato la risposta? Sto cercando di fare la stessa cosa, ma SpreadsheetsService supporta solo il nome dell'applicazione come parametro. C'è qualche soluzione che hai usato? setUserCredentials funziona per me se sono solo un utente regolare, non un dominio. – Sergei

+0

Che cos'è _namespace e assembly_ per 'DriveService'? –

risposta

5

Ecco la risposta su come fare questo ..... La chiave è quella di utilizzare i customHeaders su un nuovo requestFactory

var certificate = new 
System.Security.Cryptography.X509Certificates.X509Certificate2(p12KeyFileName, 
"notasecret", X509KeyStorageFlags.Exportable); 

string SCOPE = "https://spreadsheets.google.com/feeds 
https://docs.google.com/feeds"; 

Google.Apis.Auth.OAuth2.ServiceAccountCredential credential = new 
Google.Apis.Auth.OAuth2.ServiceAccountCredential(
    new ServiceAccountCredential.Initializer(serviceAccountEmail) 
    { 
     Scopes = new[] { SCOPE } 
    }.FromCertificate(certificate)); 


bool success = 
credential.RequestAccessTokenAsync(System.Threading.CancellationToken.None).Result; 

var requestFactory = new Google.GData.Client.GDataRequestFactory("My 
Plastic SCM Service"); 
requestFactory.CustomHeaders.Add(string.Format("Authorization: Bearer 
{0}", credential.Token.AccessToken)); 

var s = new 
SpreadsheetsService("MySpreadsheetIntegration-v1"); s.RequestFactory = 
requestFactory; 
return s; 
0

Si noti che quando si aggiunge l'intestazione personalizzata è necessario: "Autorizzazione : Portatore {0} "< - con uno spazio tra" Portatore "e" {0} " Perché: " Autorizzazione: Portatore {0} "< - senza spazio otterrà solo" un'intestazione di autorizzazione sconosciuta " Errore 401 risposta