Google Calendar API v3 – authenticate with hardcoded credentials

I have found a solution that I think that is “the official” for what you want to do.

First, you have to activate a Google API “Client ID for installed applications”.

Go to the Google API console and create the project.

Then, activate the calendar.

Go to the “API access” option, and use the “Create OAuth 2.0 client” button.

Give a name (and a logo, if you want) to the product. Click “next”.

Choose the “Installed application” option and click “Create Client Id”.

Now you have your access configurated. Now, you will need some codes. To obtain them:

*The “Authentication Code”. To get it, you need the following information:

SCOPE: https://www.google.com/calendar/feeds/ (if you want to access the calendar API. There are others you can find them at the OAuth 2.0 Playground)

CLIENT_ID: You will find it at the API Access Section at the Google API Console.

REDIRECT_URI: Get it at the same place.

Now, copy the following code into a file, put the values into the variables, execute the code (php -q script_name.php), and go to the URL printed.

<?php
$scope="";
$client_id      =   '';
$redirect_uri   =   '';

$params = array(
                    'response_type' =>   'code',
                    'client_id'     =>   $client_id,
                    'redirect_uri'  =>   $redirect_uri,
                    'scope'         =>   $scope
                    );
$url="https://accounts.google.com/o/oauth2/auth?" . http_build_query($params);        
echo $url."\n";
?>

The web page will ask you to allow the access. Do it, and you will get a code, which is your Authentication Code.

*The “Refresh Code”. To get it, you will need:

The data you used before, plus the “client secret” code in the API Console, between the “client id” and the “redirect URI”.

As you did before, copy the following code, and put the variables in place (the code field is the Authentication Code).
Execute and the result is the “Refresh Token”.

<?php
$url="https://accounts.google.com/o/oauth2/token";
$post_data = array(
                    'code'          =>   '',
                    'client_id'     =>   '',
                    'client_secret' =>   '',
                    'redirect_uri'  =>   '',
                    'grant_type'    =>   'authorization_code',
                    );
$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

$result = curl_exec($ch);
$token = json_decode($result);

echo $token->refresh_token . "\n";
?>

At this moment, you have all you need. Be careful if one day you change the Authentication Code. You will have to get new keys.

To access a calendar service, here you have the example:
Change the variable values before using it.
This example gets the primary calendar events, but you can change the address for any in the calendar API (http://code.google.com/intl/ca/apis/calendar/v3/getting_started.html#background_operations)

    <?php
    $scope="https://www.google.com/calendar/feeds/";
    $client_id      =   '';
    $client_secret="";
    $redirect_uri   =   '';


    $refresh_token  =   '';

    $token_url="https://accounts.google.com/o/oauth2/token";
    $post_data = array(
                        'client_secret' =>   $client_secret,
                        'grant_type'    =>   'refresh_token',
                        'refresh_token' =>   $refresh_token,
                        'client_id'     =>   $client_id
                        );
    $ch = curl_init();

    curl_setopt($ch, CURLOPT_URL, $token_url);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

    $result = curl_exec($ch);
    $token_object = json_decode($result);
    $access_token = $token_object->access_token;

    // Get the results
    $rest_url="https://www.googleapis.com/calendar/v3/calendars/primary/events";
    $header = "Authorization: OAuth " . $access_token;

    $ch = curl_init();

    curl_setopt($ch, CURLOPT_HTTPHEADER, array($header));
    curl_setopt($ch, CURLOPT_URL, $rest_url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

    $rest_result = curl_exec($ch);

    print_r(json_decode($rest_result));
    ?>

First, the script asks for an “Access Token”, which is valid for an hour. Then, the script gets the REST service (any in the calendar scope), sending the access token in the header.
To give a best speed at the scrip, it would be good to store the access token in a cache until it’s older than 3600 seconds. This way, the script would avoid one of the two calls.

Tips:

Visit OAuth 2.0 Playground to understand all the information sent in the OAuth process. It helped me a lot

A post by Eric Nagel in his blog gave me the solution. All the merit is to him. I can’t link it since I haven’t got enough “reputation”.

Leave a Comment