2016-07-21 6 views
6

nur mit Google Apis starten. In meinem Google Cloud Platform-Konto habe ich ein Dienstkonto für die domänenweite Delegierung erstellt. Ich habe eine private Schlüsseldatei im JSON-Format für dieses Dienstkonto gespeichert.GoogleCredential von json private Schlüsseldatei (ServiceAccount) erstellt - wie man den Benutzer zu imitieren?

In meinem Test-Anwendung ich eine GoogleCredential Instanz erschaffe:

var credential = 
      GoogleCredential.FromStream(new FileStream("privatekey.json", FileMode.Open, FileAccess.Read)) 
      .CreateScoped(Scopes); 

Wie kann ich den Benutzer i zum Imitieren wollen? Wenn ein p12 privaten Schlüssel kann ich Folgendes tun:

var credential = new ServiceAccountCredential(
    new ServiceAccountCredential.Initializer("[email protected]") //service Account id 
    { 
     Scopes = Scopes, 
     User = "[email protected]" //the user to be impersonated      
    }.FromCertificate(new X509Certificate2(@"xxx.p12", "notasecret", X509KeyStorageFlags.Exportable))); 

Aber wie kann ich tun, um diese „die einfache Weise“ mit GoogleCredential und einer json privatkey-Datei?

Mit freundlichen Grüßen

Antwort

0

Javascript unten, aber Sie können in #C ähnlich tun bin ich sicher.

verwende ich die client_id und client_secret Ansatz

function tokenRefresh(){ 

    var uri = "https://accounts.google.com/o/oauth2/token"; 

    var payload = 
     { 
     'client_id' : 'XXXXXXXX.apps.googleusercontent.com', 
     'client_secret' : 'XXXXXXXX', 
     'grant_type' : 'refresh_token', 
     'content_type' : 'application/x-www-form-urlencoded', 
     'refresh_token' : 'XXXXXXXX' 
     }; 

    var options = 
     { "method" : "POST", 
     "muteHttpExceptions" : false, 
     "payload" : payload 
     }; 

    var response = UrlFetchApp.fetch(uri, options), 
     response_json = JSON.parse(response.getContentText()), 
     token = response_json.access_token; 
    return(token); 
} 

Dies wird Ihnen ein neues Token jedes Mal, vorausgesetzt, Sie die Berechtigungen Umfang haben.

Sie müssen access_key immer Sie wollen den Zugriff auf das API (und nicht die ‚key =‘ durch einige der Google-docs angegeben)

wie Weitere Informationen zum Anhängen Umfang fühlen sich frei, zu prüfen, bekommen, was ich schrieb: http://thisistony.com/blog/googleanalytics/google-analytics-api-oauth-ever-wondered-how-to-get-the-access_token/

+1

Aber ich versuche, die .net Wrapper API zu verwenden. Ich versuche direkte Rufe zu vermeiden. – ReneDev

5

Ok ich es jetzt gelöst durch Code von den Innenseiten der GoogleCredential Kopieren und die interne Klasse DefaultCredentialProvider

using (var fs = new FileStream("key.json", FileMode.Open, FileAccess.Read)) 
{ 
    var credentialParameters = 
     NewtonsoftJsonSerializer.Instance.Deserialize<JsonCredentialParameters>(fs); 
    if (credentialParameters.Type != "service_account" 
     || string.IsNullOrEmpty(credentialParameters.ClientEmail) 
     || string.IsNullOrEmpty(credentialParameters.PrivateKey)) 
      throw new InvalidOperationException("JSON data does not represent a valid service account credential."); 
    return new ServiceAccountCredential(
     new ServiceAccountCredential.Initializer(credentialParameters.ClientEmail) 
     { 
      Scopes = Scopes, 
      User = _adminUser //the user to be impersonated 
     }.FromPrivateKey(credentialParameters.PrivateKey)); 
} 

Wenn jemand (vielleicht peleyal) eine bessere Idee hat, es zu tun di rectly über GoogleCredential geben Sie mir einen Hinweis;)

+0

Danke. Du hast mir gerade 4 Stunden Kopfschmerzen erspart, denke ich! –

Verwandte Themen