我使用以下代码通过系统登录(域范围的身份验证)代表用户执行操作。我找到的唯一实现此目的的示例使用反射来设置用户。我知道这不是完成此任务的正确方法,所以我想知道是否有人可以帮助我举例说明如何解决这个问题
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,
});
最佳答案
下面的原始答案是脆弱的,因为假设知道需要哪些属性。现在简单多了:
var credential = GoogleCredential.FromJson(GOOGLE_SYSTEM_USER_AUTH_INFORMATION)
.CreateScoped(Scopes)
.CreateWithUser(GOOGLE_CALENDAR_USERNAME);
我是这样做的,通过 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为此。
关于c# - 从系统帐户为用户创建 ServiceAccountCredential,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43256237/