Search code examples
google-calendar-apigoogle-oauthgoogle-api-dotnet-client

Authentication with Google Calendar API using Server Account and .NET


I'm using Google Calendar API V3, with OAuth2 & .NET. my authentication is by Service Account, since i need to run it as a service, without user interface. I've managed, after a lot of struggle to authenticate with the credentials, but for some reason i can't create an event on my calendar (& yes, i shared it with my self...).

i found a lot of questions regarding some same issues, but all in php, which i don't really know or think it will help me.

i seek for some help. Thanks

    String serviceAccountEmail = "[email protected]";

            var certificate = new X509Certificate2(@"key.p12", "notasecret", X509KeyStorageFlags.MachineKeySet |X509KeyStorageFlags.PersistKeySet | X509KeyStorageFlags.Exportable);
            ServiceAccountCredential credential = new ServiceAccountCredential(
               new ServiceAccountCredential.Initializer(serviceAccountEmail)
               {
                   Scopes = new[] { CalendarService.Scope.Calendar }
               }.FromCertificate(certificate));

            // Create the service.
            var service = new CalendarService(new BaseClientService.Initializer()
            {                    
                HttpClientInitializer = credential,
                ApplicationName = "Calendar API Sample",
            });

            Event e = new Event()
            {
                Summary = "Appointment1",
                Location = "42.138679, -88.045519",
                Start = new EventDateTime()
                {
                    DateTime = DateTime.Now,
                    TimeZone = "Asia/Jerusalem"
                },
                End = new EventDateTime()
                {
                    DateTime = DateTime.Now.AddDays(1),
                    TimeZone = "Asia/Jerusalem"
                },
            };

            Event createdEvent = service.Events.Insert(e, "primary").Execute();                

Solution

  • For some reason, the Insert event to a "primary" calendar, didn't do the job. Instead, i wrote the following code, which allowed me to write the event.

    var list = service.CalendarList.List().Execute().Items;
    service.Events.Insert(e, list[0].Id).Execute();
    

    This is my solution for this problem, I also agree with Craig here that the API is not well organized. (saying this after working with the amazing API of maps).