2

.NET Quickstartチュートリアルを使用してGoogleカレンダーAPIにアクセスできました。サービスアカウント認証を使用してGoogleカレンダーAPIにアクセス

このチュートリアルの問題は、Open Authentication or OAuth2を使用していることです。 Service Account Authenticationを使って同じことをしたいと思います。

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

誰かが私がサービスアカウントキーファイルを使用して、私のカレンダーにアクセスする方法の例を与えることができますか?

Google Calendar API Authentication with C#チュートリアルを試してみましたが、それを達成できませんでした。

答えて

3

私はサービスアカウントのチュートリアルで、あなたの最初の試みはうまくいかなかった理由として興味があります。何が間違っていたの?エラーはありましたか?

サービスアカウントはあなたではありません。サービスアカウントにGoogleカレンダーアカウントがあるので、個人のカレンダーの1つを読む場合は、サービスアカウントと共有する必要があります。

これは、Json service account key fileを使用した別の例です。

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

これ(とあなたのブログの記事)にこのコードを置く私にとって大きな助けとなりました。最後に、私のアプリは、サービスアカウントを使用してGoogleカレンダーAPIに対して認証されました。ありがとう! – dybzon

2

これを試してください。最初にCreate a service account Google Dev Consoleにあります。

実装の参考として、サービスアカウントの使用方法についてはDalmTo's blogpostをご確認ください。ここで

は抜粋です:

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; 
} 
1

訪問このリンクはあなたのJSON秘密鍵と自分の資格情報のみ https://github.com/CodeForget/Google-Service-Account-Authentication

here json key file othentication as well p12 authentication both

ServiceAccountAuthenticationを変更する必要がGoogleカレンダーイベントinsertメソッドとの完全な作業プロジェクトのGoogleサービスのアカウント認証を持っています。 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 
    { 

     /// <summary> 
     /// Authenticating to Google calender using a Service account 
     /// Documentation: https://developers.google.com/accounts/docs/OAuth2#serviceaccount 
     /// </summary> 
     /// Both param pass from webform1.aspx page on page load 
     /// <param name="serviceAccountEmail">From Google Developer console https://console.developers.google.com/projectselector/iam-admin/serviceaccounts </param> 
     /// <param name="serviceAccountCredentialFilePath">Location of the .p12 or Json Service account key file downloaded from Google Developer console https://console.developers.google.com/projectselector/iam-admin/serviceaccounts </param> 
     /// <returns>AnalyticsService used to make requests against the Analytics API</returns> 

     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("[email protected]");//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<EventAttendee>() 
      // { 
      // new EventAttendee() { Email = "[email protected]" } 
      //} 
     }; 

     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 = "[email protected]"; //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("[email protected]", filePath, scopes); 
      //"[email protected]" 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; 
      } 
     } 


    } 
} 
関連する問題