2017-04-06 50 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:固定,谢谢。 –