从Systems帐户为用户创建ServiceAccountCredential

时间:2017-04-06 13:11:31

标签: c# google-calendar-api google-api-dotnet-client

我使用以下代码通过系统登录(域范围的身份验证)代表用户行事。我找到的唯一一个实现此功能的例子是使用反射来设置用户。我知道这不是实现这一目标的正确方法,所以我想知道是否有人可以帮我解决这个问题应该如何解决

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

1 个答案:

答案 0 :(得分:4)

以下是我的工作方式,通过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了。