使用服务帐户身份validation访问Google Calendar API

我能够使用.NET快速入门教程访问Google Calendar API,效果很好!

该教程的问题在于它使用Open Authentication or OAuth2 。 我想使用服务帐户身份validation执行相同操作。

( https://support.google.com/googleapi/answer/6158857?hl=en )

有人能举例说明如何使用服务帐户密钥文件访问我的日历吗?

我也试过尝试使用带有C#教程的Google Calendar API身份validation,但无法完成它。

我很好奇为什么你第一次尝试使用服务帐户教程不起作用。 哪里错了? 有错误吗?

记住服务帐户不是你。 该服务帐户拥有自己的 Google日历帐户,因此,如果您尝试阅读其中一个“个人日历”,则无法使用。 您将不得不与服务帐户共享您的个人日历。

这是使用Json服务帐户密钥文件的另一个示例。

 string[] scopes = new string[] { CalendarService.Scope.Calendar }; GoogleCredential credential; using (var stream = new FileStream(serviceAccountCredentialFilePath, FileMode.Open, FileAccess.Read)) { credential = GoogleCredential.FromStream(stream) .CreateScoped(scopes); } // Create the Calendar service. var service = new CalendarService(new BaseClientService.Initializer() { HttpClientInitializer = credential, ApplicationName = "Calendar Authentication Sample", }); 

试试这个。 首先创建一个可在Google Dev Console中找到的服务帐户 。

有关实施的参考,请在此处查看DalmTo的博客文章 ,了解如何使用服务帐户。

这是一个片段:

 var certificate = new X509Certificate2(keyFile, "notasecret", X509KeyStorageFlags.Exportable); try{ ServiceAccountCredential credential = new ServiceAccountCredential( new ServiceAccountCredential.Initializer(serviceAccountEmail) { Scopes = scopes }.FromCertificate(certificate)); //Create the service. DriveService service = new DriveService(new BaseClientService.Initializer() { HttpClientInitializer = credential, ApplicationName = "Drive API Sample" }); return service; } catch (Exception ex) { Console.WriteLine(ex.InnerException); return null; } 

访问此链接有完整的工作项目谷歌服务帐户身份validation与谷歌日历事件插入方法您必须更改您的json私钥和您的凭据仅https://github.com/CodeForget/Google-Service-Account-Authentication

这里json密钥文件和身份validation以及p12身份validation

ServiceAccountAuthentication.cs

 using Google.Apis.Calendar.v3; using Google.Apis.Auth.OAuth2; using Google.Apis.Services; using System; using System.IO; using System.Security.Cryptography.X509Certificates; using Google.Apis.Calendar.v3.Data; namespace GoogleSamplecSharpSample.Calendarv3.Auth { public static class ServiceAccountExample { ///  /// Authenticating to Google calender using a Service account /// Documentation: https://developers.google.com/accounts/docs/OAuth2#serviceaccount ///  /// Both param pass from webform1.aspx page on page load /// From Google Developer console https://console.developers.google.com/projectselector/iam-admin/serviceaccounts  /// Location of the .p12 or Json Service account key file downloaded from Google Developer console https://console.developers.google.com/projectselector/iam-admin/serviceaccounts  /// AnalyticsService used to make requests against the Analytics API public static CalendarService AuthenticateServiceAccount(string serviceAccountEmail, string serviceAccountCredentialFilePath, string[] scopes) { try { if (string.IsNullOrEmpty(serviceAccountCredentialFilePath)) throw new Exception("Path to the service account credentials file is required."); if (!File.Exists(serviceAccountCredentialFilePath)) throw new Exception("The service account credentials file does not exist at: " + serviceAccountCredentialFilePath); if (string.IsNullOrEmpty(serviceAccountEmail)) throw new Exception("ServiceAccountEmail is required."); // For Json file if (Path.GetExtension(serviceAccountCredentialFilePath).ToLower() == ".json") { GoogleCredential credential; //using(FileStream stream = File.Open(serviceAccountCredentialFilePath, FileMode.Open, FileAccess.Read, FileShare.None)) using (var stream = new FileStream(serviceAccountCredentialFilePath, FileMode.Open, FileAccess.Read)) { credential = GoogleCredential.FromStream(stream) .CreateScoped(scopes).CreateWithUser("xyz@gmail.com");//put a email address from which you want to send calendar its like (calendar by xyz user ) } // Create the Calendar service. return new CalendarService(new BaseClientService.Initializer() { HttpClientInitializer = credential, ApplicationName = "Calendar_Appointment event Using Service Account Authentication", }); } else if (Path.GetExtension(serviceAccountCredentialFilePath).ToLower() == ".p12") { // If its a P12 file var certificate = new X509Certificate2(serviceAccountCredentialFilePath, "notasecret", X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.Exportable); var credential = new ServiceAccountCredential(new ServiceAccountCredential.Initializer(serviceAccountEmail) { Scopes = scopes }.FromCertificate(certificate)); // Create the Calendar service. return new CalendarService(new BaseClientService.Initializer() { HttpClientInitializer = credential, ApplicationName = "Calendar_Appointment event Using Service Account Authentication", }); } else { throw new Exception("Something Wrong With Service accounts credentials."); } } catch (Exception ex) { throw new Exception("Create_Service_Account_Calendar_Failed", ex); } } } } 

添加webform.aspx并将此代码放在webform.aspx.cs上

 using System; using Google.Apis.Calendar.v3; using GoogleSamplecSharpSample.Calendarv3.Auth; using Google.Apis.Calendar.v3.Data; namespace CalendarServerToServerApi { public partial class WebForm1 : System.Web.UI.Page { // create event which you want to set using service account authentication Event myEvent = new Event { Summary = "Visa Counselling", Location = "Gurgaon sector 57", Start = new EventDateTime() { DateTime = new DateTime(2017, 10, 4, 2, 0, 0), TimeZone = "(GMT+05:30) India Standard Time" }, End = new EventDateTime() { DateTime = new DateTime(2017, 10, 4, 2, 30, 0), TimeZone = "(GMT+05:30) India Standard Time" } //, // Recurrence = new String[] { //"RRULE:FREQ=WEEKLY;BYDAY=MO" //} //, // Attendees = new List() // { // new EventAttendee() { Email = "Srivastava998@gmail.com" } //} }; protected void Page_Load(object sender, EventArgs e) { } public void Authenticate(object o, EventArgs e) { string[] scopes = new string[] { CalendarService.Scope.Calendar //, // Manage your calendars //CalendarService.Scope.CalendarReadonly // View your Calendars }; string cal_user = "calenderID@gamil.com"; //your CalendarID On which you want to put events //you get your calender id "https://calendar.google.com/calendar" //go to setting >>calenders tab >> select calendar >>Under calender Detailes at Calendar Address: string filePath = Server.MapPath("~/Key/key.json"); var service = ServiceAccountExample.AuthenticateServiceAccount("xyz@projectName.iam.gserviceaccount.com", filePath, scopes); //"xyz@projectName.iam.gserviceaccount.com" this is your service account email id replace with your service account emailID you got it . //when you create service account https://console.developers.google.com/projectselector/iam-admin/serviceaccounts insert(service, cal_user, myEvent); } public static Event insert(CalendarService service, string id, Event myEvent) { try { return service.Events.Insert(myEvent, id).Execute(); } catch (Exception ex) { Console.WriteLine(ex.Message); return null; } } } }