Google Account Authentication APIを利用してGoogleカレンダーのフィードを取ってくる

あまり大きくアナウンスされてなかったGoogleのWebアプリ用認証APIだけど、今までまともに動かなかったのが、最近やっとちゃんと動作するようになったみたい。

とりあえず、Googleで認証してからトークンをもらって、Googleカレンダー内のプライベートスケジュールを取ってくるサンプルアプリ。

http://googleaccount.ning.com/

フィードをとってくる以外のことはしてません(=悪いことはしてません)。まあningなので信用できない人はアプリをコピーしてから使ってみてください。

ningにアカウント持ってない人のために、とりあえず微妙なソースをあげておく。PHP慣れません。

gcalendar.php

<?php
require_once 'gauth_utils.php';

session_start();

// google session token is available ?
if (check_google_session('http://www.google.com/calendar/feeds/')) {
  $session_token = $_SESSION['google_token'];
  $feed_url = 'http://www.google.com/calendar/feeds/default/private/full';

  // retrieve calendar feeds 
  $xmlstr = google_request($feed_url, $session_token);

  // xslt
  $xsldoc = new DOMDocument();
  $xmldoc = new DOMDocument();
  $xsl = new XSLTProcessor();
  $xmldoc->loadXML($xmlstr);
  $xsldoc->load(dirname(__FILE__) . '/gcalendar_feed.xsl');
  $xsl->importStyleSheet($xsldoc);
  $result = $xsl->transformToXML($xmldoc);
  header("Content-Type: text/html; charset=utf-8");
  print($result);
}
?>


gauth.php

<?php
require_once 'HTTP.php';
require_once 'gauth_utils.php';

session_start();

$return_url = $_REQUEST['return'];
$return_url = isset($return_url) ? $return_url : '/';

$onetime_token = $_REQUEST['token'];

if (isset($onetime_token)) { // onetime token is passed via URL parameter
  $session_token = get_session_token($onetime_token);
  $_SESSION['google_token'] = $session_token;

  // redirect to original request URL
  HTTP::Redirect($return_url);  

} else { // no onetime token is available

  $scope_url = $_REQUEST['scope'];
  $next_url  = 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF'];
  $next_url .= '?return=' . urlencode($return_url);

  $request_url = 'http://www.google.com/accounts/AuthSubRequest';
  $request_url .= '?next=';
  $request_url .= urlencode($next_url);
  $request_url .= '&scope=';
  $request_url .= urlencode($scope_url);
  $request_url .= '&session=1&secure=0';

  // redirect to AuthSubReq URL
  HTTP::Redirect($request_url);
}
?>


gauth_utils.php

<?php
require_once 'HTTP.php';
require_once 'HTTP/Request.php';

/**
 * send request to google service url with authsub token
 */
function google_request($url, $token) 
{
  $req =& new HTTP_Request($url);
  $auth_header = 'AuthSub token="' . $token . '"';
  $req->addHeader("Authorization", $auth_header);
  if (!PEAR::isError($req->sendRequest())) {
    return $req->getResponseBody();
  }
}

/**
 * convert onetime token to session token
 */
function get_session_token($onetime_token) 
{
  $session_url = 'https://www.google.com/accounts/AuthSubSessionToken';
  $content = google_request($session_url, $onetime_token);
  $session_tokens = split("=", trim($content));
  return $session_tokens[1];
}

/**
 * check if the google session token is available or not
 */
function check_google_session($scope_url)
{
  $session_token = $_SESSION['google_token'];

  if (isset($session_token)) {
    $token_url = 'https://www.google.com/accounts/AuthSubTokenInfo';
    $content = google_request($token_url, $session_token);
    if ($content!=null) return true;
  }
  $return_url = $_SERVER['REQUEST_URI'];
  $gauth_url  = '/gauth.php?return=';
  $gauth_url .= urlencode($return_url);
  $gauth_url .= '&scope=';
  $gauth_url .= urlencode($scope_url);

  HTTP::Redirect($gauth_url);
  return false;
}

?>