2016-07-21 9 views
6

właśnie zaczynając od Google Apis. Na moim koncie Google Cloud Platform utworzyłem konto usługi dla delegowania na całą domenę. Zapisałem plik klucza prywatnego w formacie json dla tego konta usługi.GoogleCredential stworzony przez plik klucza prywatnego json (ServiceAccount) - jak ustawić użytkownika pod kątem podszywania się pod niego?

W mojej aplikacji testowej Tworzę GoogleCredential instancję:

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

Jak mogę ustawić użytkownikowi Chcę podszywać? Przy użyciu klucza prywatnego p12 mogę zrobić co następuje:

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

Ale w jaki sposób można zrobić to „na łatwiznę” z GoogleCredential oraz pliku privatkey json?

poważaniem

Odpowiedz

0

Javascript poniżej, ale można zrobić podobny #C jestem pewien.

używam CLIENT_ID i client_secret podejście

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

To daje nowy token za każdym razem, zakładając, że masz odpowiednie uprawnienia zakres.

Musisz dołączyć access_key każdym razem, gdy chcesz uzyskać dostęp do API (raczej niż „key =” określone przez niektórych Dokumentów Google)

Aby uzyskać więcej informacji o tym, jak uzyskać zakres krępuj się sprawdzić, co napisałem: http://thisistony.com/blog/googleanalytics/google-analytics-api-oauth-ever-wondered-how-to-get-the-access_token/

+1

Ale próbuję użyć api otoki .net. Próbuję unikać bezpośrednich wezwań do odpoczynku. – ReneDev

5

Ok i rozwiązać go teraz kopiując kod z wewnętrznych stronach GoogleCredential a klasa wewnętrznego 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)); 
} 

Jeśli ktoś (może peleyal) ma lepszy pomysł, aby zrobić di bezpośrednio za pomocą GoogleCredential możesz dać mi wskazówkę;)

+0

Dziękuję. Uratowałeś mnie około 4 godzinnego bólu głowy, tak myślę! –

Powiązane problemy