サービス アカウント + 偽装を使用して Google カレンダーのエントリを取得すると、次のエラーが発生します。
エラー:"access_denied"、説明:""、Uri:""
ユーザーとサービス アカウント フローの両方を使用してイベントを作成できます (偽装なし)。ユーザーとサービス アカウント フローの両方を使用してカレンダーを取得できます (偽装の有無にかかわらず)。ユーザー フローのみでカレンダー イベントを取得できます。
関連する問題として、oAuth2 ユーザー フローを使用すると、返されたイベントに参加者ではないイベントが含まれていることに気付きました。
サービス アカウント + 偽装コードは次のとおりです。
string serviceAccountEmail = "...@developer.gserviceaccount.com";
var certificate = new X509Certificate2(Server.MapPath("~") + @"\bin\key.p12", "notasecret",
X509KeyStorageFlags.Exportable);
ServiceAccountCredential credential = new ServiceAccountCredential(new
ServiceAccountCredential.Initializer(serviceAccountEmail)
{ Scopes = new[] { CalendarService.Scope.Calendar }, User="my email here" }.FromCertificate
(certificate));
BaseClientService.Initializer initializer = new BaseClientService.Initializer();
initializer.HttpClientInitializer = credential;
initializer.ApplicationName = "Google Calendar Sample";
service = new CalendarService(initializer);
IList list = service.CalendarList.List().Execute().Items; // throws error
foreach (CalendarListEntry calendar in list)
DisplayFirstCalendarEvents(calendar);
Calendar を直接取得しても、同じエラーがスローされます。
Calendar cal1 = service.Calendars.Get("my personal calendar id").Execute(); //throws same error