2014-12-06 80 views
2

我正在使用帶有key.p12證書的服務帳戶來訪問Google日曆API。但是,它無法訪問域中的任何用戶日曆。我確實遵循了將全域範圍權限授權給服務帳戶的步驟 https://developers.google.com/accounts/docs/OAuth2ServiceAccount如何在.net中使用服務帳戶訪問域用戶的日曆?

它沒有用於.net的代碼示例。而且似乎我只在Google .net客戶端庫中獲得ServiceAccountCredential。這是我的代碼

static void Main(string[] args) 
    { 
     string serviceAccountEmail = "[email protected]"; 
     var certificate = new X509Certificate2(@"clientPrivateKey.p12", "notasecret", X509KeyStorageFlags.Exportable); 

     Console.WriteLine("service account: {0}", serviceAccountEmail); 

     ServiceAccountCredential credential = new ServiceAccountCredential(new 
     ServiceAccountCredential.Initializer(serviceAccountEmail) 
     { 
      Scopes = new[] { CalendarService.Scope.Calendar } 
     }.FromCertificate(certificate)); 

     BaseClientService.Initializer initializer = new BaseClientService.Initializer();    

     initializer.HttpClientInitializer = credential;   
     initializer.ApplicationName = "Google Calendar Sample"; 
     CalendarService calservice = new CalendarService(initializer); 

     // list all the calendars it can see 
     try 
     { 
      var list = calservice.CalendarList.List().Execute(); 

      if (list.Items.Count > 0) 
      { 
       foreach(var item in list.Items) 
       { 
        Console.WriteLine("Found calendar for account {0}", item.Id); 
       } 
      } 
      else 
      { 
       Console.WriteLine("Calendar list for this service account is empty"); 
      } 
     } 
     catch(Exception ex) 
     { 
      Console.WriteLine(ex.Message); 
     } 
    } 

日曆列表始終爲空。如果我手動在日曆設置中與此服務帳戶共享我的域帳戶日曆,則此代碼將成功返回我的域帳戶日曆。

有沒有辦法讓這個服務帳戶訪問域中的所有用戶的日曆?

回答

2

實際上,代碼應該使用服務帳戶來逐個「模擬」域用戶,而不是試圖與服務帳戶共享日曆。

ServiceAccountCredential.Initializer(serviceAccountEmail) 
    { 
     Scopes = new[] { CalendarService.Scope.Calendar }, 
     User = "[email protected]" // impersonate domain user 
    }.FromCertificate(certificate)); 

還需要遵循委派域範圍內的權力,在谷歌域管理員控制檯服務帳戶的步驟,並添加合適的範圍(日曆,它是https://www.googleapis.com/auth/calendar

0

正如您所指出的,你需要的服務帳戶,共享現有日曆

<paste-your-account-here>@developer.gserviceaccount.com 

(你可以找到在谷歌開發者控制檯的憑據選項卡下的問題賬戶,這就是所謂的「電子郵件地址」 )

希望它有幫助。

相關問題