サービスアカウントを使ってG Suiteドメイン内のカレンダーにアクセスする

  • 1
    いいね
  • 0
    コメント

内容

一般のアプリのように使用者に承認してもらってアクセスするのではなく、社内でのアプリ・サービスのバックエンドとしてG Suiteのドメイン内のカレンダーにアクセスする方法。
ドメイン外のカレンダーにはアクセスできない。

サービスアカウントのドメインへの認証はG Suiteの管理画面から行うため、管理者しか行うことが出来ません。

準備

nuget

Google CalendarのAPIパッケージをインストールしておきます。

 PM> Install-Package Google.Apis.Calendar.v3

認証id作成

Google cloud platformのdeveloper consoleにアクセス。
プロジェクトを作成し、左メニューのライブラリからGoogle Calendar APIを検索して有効にする。

左メニューの認証情報→認証情報を作成→サービスアカウントキーを選択し、サービスアカウント→新しいサービスアカウントを選ぶ。
サービスアカウント名を適当(ここでは"hogehoge"とする)に入力。役割はひとまずProject→オーナーを選択。1
キーのタイプはP12を選択。鍵ファイル(.p12)がダウンロードされるので保存しておく。

サービスアカウントの管理をクリックし、先程作成したサービスアカウントの右側のメニューから編集をクリック。
「G Suite ドメイン全体の委任を有効にする」のチェックを入れて保存する。

認証情報画面をリロードするとOAuth2.0 クライアントIDに「hogehoge のクライアント」が作成されているので右側の編集ボタンをクリック。
クライアント詳細ページのクライアントIDとサービスアカウントのメールアドレスを控えておく。

G Suiteに登録

G Suite管理コンソール( https://admin.google.com/ )にログイン。
セキュリティ→APIリファレンスを開き「API アクセスを有効にする」にチェックを入れる。
同じくセキュリティ→詳細設定→「API クライアント アクセスを管理する」をクリック。

クライアント名に先ほど控えたクライアントID、1つ以上のAPIの範囲にスコープを入力して承認。

Calendar APIのスコープは下記のページの2つ。
https://developers.google.com/identity/protocols/googlescopes#calendarv3

ここでは"https://www.googleapis.com/auth/calendar" を入力。
ここのスコープは実際に書くプログラムと合わせる必要がある。

コーディング

C#コンソールアプリで作成。example.comドメインの場合。

コードの説明はコメントに記載。

実行するとpiyo@example.com部分のアカウントのカレンダーに予定が作成され、作成者はmoge@example.com部分のアカウントになっているはずです。
カレンダーIDを指定すればドメイン内のカレンダーリソースにもアクセスできる。

// 認証情報作成時にDLしたキーファイルを実行ファイルと同じ場所に配置。
var keyFilePath = "key.p12";    
var certificate = new X509Certificate2(keyFilePath, "notasecret", X509KeyStorageFlags.Exportable);
var serviceAccountEmail = "控えておいたサービスアカウントのメールアドレス"; 

var credential = new ServiceAccountCredential(
        new ServiceAccountCredential.Initializer(serviceAccountEmail)
        {
            Scopes = new string[] { CalendarService.Scope.Calendar },   // 管理コンソールで設定したのと同じスコープ
            User = "moge@example.com"   // G Suiteの管理者アカウントを設定する。このアカウントが実行したことになる
        }.FromCertificate(certificate));

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

// ドメイン内のカレンダーを取得
var cal = service.Calendars.Get("piyo@example.com").Execute();
Console.WriteLine(cal.Id);

// ドメイン内のカレンダーに予定を作成
var schedule = new Event()
{
    Summary = "APIからのテストスケジュール",
    Start = new EventDateTime()
    {
        DateTime = new DateTime(2017, 7, 10, 12, 0, 0)
    },
    End = new EventDateTime()
    {
        DateTime = new DateTime(2017, 7, 10, 13, 0, 0)
    },
    Description = "詳細"
};

service.Events.Insert(schedule, "piyo@example.com").Execute();

Console.WriteLine("press Enter key...");
Console.Read();

APIリファレンス

https://developers.google.com/google-apps/calendar/v3/reference/


  1. この部分は要検証