Edit Google calendar events from Google service account: 403

14,806

I solved it, and the issue was not code, It works fine.

The problem was sharing my calendar. Something that I don't knew.

To allow edit your calendar events from service account, do not have enough with all steps you do in the Google Api Console, you have to give permission from your calendar configuration (Calendar configuration -> Share this calendar) to the email account specified into Google Api Console (email adress).

This can be a problem if it's a business account, then you will have to contact the account administrator.

The code shown here works correctly, so I hope it helps someone, just remember that you must use 475 version of the Google Api Client.

You can find at this link: http://google-api-php-client.googlecode.com/svn/trunk/src/

Share:
14,806
eMarine
Author by

eMarine

Full-stack web developer specialized in the Front End layer. I’m a passionate builder that happens to be good at coding. Thanks to my great capacity for learning and adaptability, I can change my role easily and handle situations outside of my comfort zone. Throughout my career as a Web developer, I have performed many different tasks, I have led teams, designed and developed full-stack solutions, created server processes and APIs, taught in the private sector, built multi-platform mobile apps, etc. I consider that teamwork is fundamental for success and I don't believe in unique and perfect solutions, every problem has many solutions.

Updated on June 23, 2022

Comments

  • eMarine
    eMarine almost 2 years

    I want to create new event at google calendar from Service Account. I can access correctly and print a list all my calendars. But when I want to create a new event the response is 403 Forbidden.

    My code:

    require_once 'src/Google_Client.php';
    require_once 'src/contrib/Google_CalendarService.php';
    
    session_start();
    
    const CLIENT_ID = 'XXXXXXXXXX.apps.googleusercontent.com';
    const SERVICE_ACCOUNT_NAME = '[email protected]';
    
    const KEY_FILE = 'google_src/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX-privatekey.p12';
    
    $client = new Google_Client();
    $client->setApplicationName("APP_NAME");
    
    if (isset($_SESSION['token'])) {
     $client->setAccessToken($_SESSION['token']);
    }
    
    $key = file_get_contents(KEY_FILE);
    $client->setClientId(CLIENT_ID);
    $client->setAssertionCredentials(new Google_AssertionCredentials(
      SERVICE_ACCOUNT_NAME,
      'https://www.google.com/calendar/feeds/MY_CALENDAR_ID/private/full/',
      $key)
    );
    
    $client->setClientId(CLIENT_ID);
    $cal = new Google_CalendarService($client);
    $event = new Google_Event();
    $event->setSummary('Bon dia pel matí!');
    $event->setLocation('Somewhere');
    $start = new Google_EventDateTime();
    $start->setDateTime('2012-08-06T10:00:00.000-07:00');
    $event->setStart($start);
    $end = new Google_EventDateTime();
    $end->setDateTime('2012-09-06T10:25:00.000-07:00');
    $event->setEnd($end);
    
    $createdEvent = $cal->events->insert(CALENDAR_NAME, $event);
    

    And server response:

    (403) Forbidden
    

    Any ideas? Maybe other scope, or allow edit events (I dont know where I can configure this and I have searched it, promise)

    Of course, my calendar is a public calendar.

    Any help will be welcome :)

    Thanks!