2016-07-21 31 views
6

剛開始使用Google Apis。 在我的Google雲端平臺帳戶中,我爲域範圍委派創建了一個服務帳戶。我爲此服務帳戶保存了json格式的私鑰文件。由json私鑰文件(ServiceAccount)創建的GoogleCredential - 如何設置用戶模擬?

在我的測試應用程序我創建一個GoogleCredential實例:

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

我怎麼可以設置我想冒充用戶? 當使用P12私鑰我能做到以下幾點:

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

但我怎麼能做到這一點「的簡單方法」與GoogleCredential和JSON privatkey文件?

親切的問候

回答

0

Javascript下面,但你可以在#C做類似的工作我敢肯定。

我使用CLIENT_ID和client_secret方法

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

這將每次給你一個新的令牌,假設你有正確的範圍權限。

您將需要追加(由一些谷歌的文檔的指示,而不是「鍵=」),你要訪問的API access_key每次

有關如何獲取範圍隨意簽出更多的信息是什麼我寫道:http://thisistony.com/blog/googleanalytics/google-analytics-api-oauth-ever-wondered-how-to-get-the-access_token/

+1

但我想使用.net包裝API。我試圖避免直接的休息電話。 – ReneDev

5

好吧,我現在解決它由GoogleCredential的內部和內部類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)); 
} 

如果有人(或許peleyal)還有更好的主意去做迪複製代碼直接通過GoogleCredential隨時給我一個提示;)

+0

謝謝。你剛剛救了我大約4個小時的頭痛,我想! –