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; } ?>