前提・実現したいこと
実現したいことは、LaravelでGoogleカレンダーの予定を作成する際に**「ゲストを追加」機能**を実装したいです。
LaravelでGoogleカレンダーと連携したシステムを構築しています。laravel-google-calendarというパッケージを使用し、Googleカレンダーを操作する機能を実装しています。Googleの認証にはサービスアカウントを使用しています。PostmanからLaravelにリクエストを投げて機能の検証をしています。
発生している問題・エラーメッセージ
- Googleカレンダーから予定を追加する機能は実装できた
php
1namespace App\Http\Controllers; 2 3use Illuminate\Http\Request; 4use Spatie\GoogleCalendar\Event; 5use Illuminate\Support\Carbon; 6 7class CalendarController extends Controller 8{ 9 public function store() 10 { 11 $event = new Event; 12 $event->name = '検証用'; 13 $event->startDateTime = Carbon::now(); 14 $event->endDateTime = Carbon::now()->addHour(); 15 $event->description = "テスト説明文\nテスト説明文\nテスト説明文"; 16 $event->save(); 17 18 return '成功'; 19 }
予定を追加する機能に、「ゲストを追加」できる機能も実装したいです。そこで、laravel-google-calendarのaddAttendeeメソッドを使用するとエラーが表示されます。
php
1 public function store() 2 { 3 $event = new Event; 4 $event->name = '検証用'; 5 $event->startDateTime = Carbon::now(); 6 $event->endDateTime = Carbon::now()->addHour(); 7 $event->addAttendee(['email' => 'test2@gmail.com']); // この一行を追加 8 $event->description = "テスト説明文\nテスト説明文\nテスト説明文"; 9 $event->save(); 10 11 return '成功'; 12 }
返却されたエラー↓
Google\Service\Exception: { "error": { "errors": [ { "domain": "calendar", "reason": "forbiddenForServiceAccounts", "message": "Service accounts cannot invite attendees without Domain-Wide Delegation of Authority." } ], "code": 403, "message": "Service accounts cannot invite attendees without Domain-Wide Delegation of Authority." } } in file /var/www/vendor/google/apiclient/src/Http/REST.php on line 128
実装手順1(Google APIを利用するためのサービスアカウントの設定)
- Google Cloud Platformへのログイン
- プロジェクトを作成
- Google Calendar APIの有効化.
- サービスアカウントを作成
- サービスアカウントでキーを作成
実装手順2(サービスアカウントへのドメイン全体の権限の委任の有効化)
サービスアカウントにドメイン全体の委任を有効
- 作成したサービスアカウントに画面遷移
- 編集ボタンを押下
- 「G Suite ドメイン全体の委任を有効にする」チェックボタンを押下
- 保存
サービスアカウントにカレンダースコープを提供
- Google Adminにログイン
- 「セキュリティ」 → 「APIの制御」 → 「ドメイン全体の委任」に移動
- サービスアカウントで発行されたクライアントIDを元にAPIクライアントを追加
- 追加したスコープ https://www.googleapis.com/auth/calendar,https://www.googleapis.com/auth/calendar.events,https://www.googleapis.com/auth/admin.directory.resource.calendar
IAMの設定
- Google Cloud PlatformのIAMの画面にログイン
- サービスアカウントで作成したメールをIAMにオーナー権限で追加
実装手順3(Googleカレンダーの設定)
アカウントA(test1@gmail.com)とアカウントB(test2@gmail.com)の設定
- カレンダーの追加
- カレンダーのアクセス設定
- 特定のユーザーとの共有設定でサービスアカウントで発行されたメールをを設定
- 権限は「予定の変更」
- カレンダーIDの取得
実装手順4(Laravel)
- Composerでlaravel-google-calendar "2.2.2"をインストール
- サービスプロバイダーの設定
- config/google-calendar.phpの設定
php
1return [ 2 3 /* 4 * Path to the json file containing the credentials. 5 */ 6 'service_account_credentials_json' => storage_path('app/google-calendar/service-account-credentials.json'), 7 8 /* 9 * The id of the Google Calendar that will be used by default. 10 */ 11 'calendar_id' => env('GOOGLE_CALENDAR_ID'), 12];
- app/google-calendar配下にサービスアカウントでダウンロードしたファイルをservice-account-credentials.json名で保存
- ルーティングの設定
php
1Route::resource( 2 'calendar', 3 'CalendarController', 4 ['only' => ['index', 'store']] 5);
- コントローラの設定
php
1namespace App\Http\Controllers; 2 3use Illuminate\Http\Request; 4use Spatie\GoogleCalendar\Event; 5use Illuminate\Support\Carbon; 6 7class CalendarController extends Controller 8{ 9 public function index() 10 { 11 $event = new Event; 12 $events = Event::get(); 13 foreach ($events as $event) { 14 echo $event->name . ''; 15 } 16 } 17 18 public function store() 19 { 20 $event = new Event; 21 $event->name = '検証用'; 22 $event->startDateTime = Carbon::now(); 23 $event->endDateTime = Carbon::now()->addHour(); 24 $event->addAttendee(['email' => 'test2@gmail.com']); 25 $event->description = "テスト説明文\nテスト説明文\nテスト説明文"; 26 $event->save(); 27 28 return '成功'; 29 }
- .envの設定
GOOGLE_CALENDAR_ID=test1@gmail.com
補足情報(FW/ツールのバージョンなど)
Laravel 5.8.36
PHP 7.3
spatie/laravel-google-calendar 2.2.2
参考にした記事
https://stackoverflow.com/questions/60760959/google-calendar-api-service-account-error
https://issuetracker.google.com/issues/141704931
https://github.com/spatie/laravel-google-calendar/issues/125
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。