2017-04-06 49 views
2

我使用以下代碼通過系統登錄名(域範圍驗證)代表用戶執行操作。我發現的唯一例子是使用反射來設置用戶。我知道這是不是做到這一點,所以我在想,如果有人可以幫助我的這個應該怎麼解決的例子有道從系統帳戶爲用戶創建ServiceAccountCredential

ServiceAccountCredential credential = 
    GoogleCredential.FromJson(GOOGLE_SYSTEM_USER_AUTH_INFORMATION) 
     .CreateScoped(Scopes) 
     .UnderlyingCredential as ServiceAccountCredential; 

var userField = typeof(ServiceAccountCredential).GetField("user", 
BindingFlags.NonPublic | BindingFlags.Instance); 
userField?.SetValue(credential, GOOGLE_CALENDAR_USERNAME); //Act in the guise of the normal user GOOGLE_CALENDAR_USERNAME 


service = new CalendarService(new BaseClientService.Initializer() 
{ 
    HttpClientInitializer = credential, 
    ApplicationName = ApplicationName, 
}); 

回答

3

這是我怎麼會做它,同時設置範圍並通過ServiceAccountCredential.Initializer同時新用戶:

ServiceAccountCredential original = (ServiceAccountCredential) 
    GoogleCredential.FromJson(GOOGLE_SYSTEM_USER_AUTH_INFORMATION).UnderlyingCredential; 

var initializer = new ServiceAccountCredential.Initializer(original.Id) 
{ 
    User = GOOGLE_CALENDAR_USERNAME, 
    Key = original.Key, 
    Scopes = Scopes 
}; 
var credentialForUser = new ServiceAccountCredential(initializer); 

現在給你一個ServiceAccountCredential而非GoogleCredential。這就是你當前的代碼使用,所以它應該沒問題 - 但如果有一個簡單的方法獲得GoogleCredential,那也不錯。我們應該使這一切都更簡單 - 我爲filed an issue

+0

工程就像一個魅力。兩個小錯誤,在GOOGLE_CALENDAR_USERNAME和ServiccAccountCredential拼錯後丟失逗號。 –

+0

@LinusNikander:固定,謝謝。 –