OAuth2.0 認証(Google APIs Client Library for PHP)について

Google Analytics のデータを使用して、ページビューのチャートと人気記事の一覧を表示するプラグインを作成した時に、はまった注意点を忘備録としてまとめておきます

元々は Hello Analytics API チュートリアルをやってみる で書いたようにサンプルコードを WordPress のプラグイン形式にして変換して、OAuth2.0 の認証やアナリティクスデータ取得をしてみただけっだったのですが、せっかくなのでこれをベースに人気記事を表示する GA-PVcounter プラグインを作ってみました。

この時の作業で、ここは注意したほうがよいかなというポイントを整理しておきます

OAuth2.0 を使うべきか?

WordPress のプラグインを作るにあたって、他のプラグインでアナリティクスデータを取得しているプログラムをいくつか見てみたのですが、Hello Analytics API チュートリアルで使用していた AOuth2.0 認証を行う Google APIs Client Library for PHP ライブラリを使用しているプラグインは、まだあまり無いようです

gapi(Google Analytics Php interface)等の他のライブラリを使っているもののほうが多く、データ取得するにもユーザーIDとパスワードを用いている場合が多いようです

但し、gapi は、少し古い方法のようなので、これから作るには Google APIs Client Library for PHP ライブラリを使うほうがよさそうなので、こちらで進めることとしました

メリットとしては、ユーザーIDとパスワードを使用しないところです
アクセスする側にユーザーIDとパスワードを知らせのはセキュリティ的によろしくないですから、アクセス手順がちょっと面倒になっても OAuth2.0 は使うべきと判断しました

ユーザーIDとパスワードの代わりに Client ID を使います

Google の資料が英語ばかりなので、OAuth の内容がなかなか頭に入って来ませんが、
簡単にいえば、アナリティクス等のアクセスされる側が、データにアクセスしてくるアプリケーションやWebサイト毎に Client ID というコードを作成して許可を与えるってことです (^^)

Client ID の作成法は?

Client ID の作成手順が、若干わかりづらいので http://code.google.com/apis/console-help/#UsingOAuth2 この辺りを参照してもらうとして、WordPress のプラグインで使用する時の注意点としては Redirect URIs を修正する必要があるところです

Redirect URIs は、OAuth 認証後にリダイレクトして表示されるページを指定します
GA-PVcounter プラグインの場合は、プラグインの設定画面がリダイレクト先となるので、下記方法でURIを取得出来ます

admin_url(‘options-general.php?page=GA-PVcounter/GA-PVcounter.php’)

実際は、設定画面にURIを表示するようにすれば、それをコピーして貼り付けることで修正が可能です

アクセストークン

作成した Client ID を使って認証したら、アクセストークンが取得できるのでこれを保存します
アクセストークンは、 $_GET[‘code’] にセットされてきます

 //oauth 認証により アクセストークン取得
 if (isset($_GET['code'])) {
    $client->authenticate();
    $access['token'] = $client->getAccessToken();
    update_option('ga_pvc_access', $access );
    header('Location: ' . $option['redirect']);
    exit;
 }

取得したアクセストークンは、データベースに保存してから、ページを再読み込みさせます

WordPress の場合は、update_option 関数で簡単にデータベースへの保存が出来ます

ちなみにチュートリアルでは、$_SESSION セッションに保存していましたが、アクセスしたブラウザーに紐づいてしまうので、今回はプラグインプログラムということでもありデータベースを使いトークンを保存します

認証が済み、アクセストークンを取得したら、以降はこのアクセストークンを用いてデータにアクセスすることが出来るようになります

但し、アクセストークンには有効期限があります(3600秒?)

従って、有効期限を調べ必要なら更新してからデータにアクセスするようにします

 //トークンの期限チェック
 $client->setAccessToken($access['token']);
 $token= json_decode($access['token']);
 if($now - 60  > $token->created + $token->expires_in) {
     //トークンリフレッシュ
     $client->refreshToken($token->refresh_token);
     $access['token'] = $client->getAccessToken();
     update_option('ga_pvc_access', $access );
 }

ここでは、問い合わせ前に有効期限を調べて、有効期限が60秒以上残っていなければ、アクセストークンを更新して保存しています

Google APIs Client Library for PHP ライブラリの位置は?

Google APIs Client Library for PHP ライブラリは、サンプルプログラムも含め結構なコードサイズとなっています

バージョンの更新も結構行われているので、望ましいのは、WordPress の決まった配置位置があるのがいいと思うのですが、分からなかったので、プラグインの下に配置することとしました

こうすれば、プラグインのインストール時に同時にインストール出来るので扱いとしては楽なのですが、他のプラグイン等で同じライブラリ、あるいはバージョンの異なるライブラリが使われている可能性もあります

実際、有名な google-analycator というプラグインでライブラリが使われており、競合しました

require_once だけではうまく回避出来ませんでした

ライブラリに手を入れずに名前空間を使って競合を回避できるか調べてみたのですが、よくわかりません (^_^;)

今回は、チュートリアルでも使用していた2つのライブラリコードを読み込んで使用しているのですが、実際にアクセスする場合にのみライブラリを読み込むこととして、おまじないとして class_exists 関数でクラスがないことを確認してから読み込むようにしています。簡単な解決法があれば良いのですが (^_^;)

 $requri = $_SERVER['REQUEST_URI'];
 if( (!is_admin() && $queryfg) || stripos($requri, 'GA-PVcounter.php' ) !== false ){
     if(!class_exists('Google_Client', FALSE)) { 
         require_once __DIR__.'/google-api-php-client/src/Google_Client.php';
     }
     if(!class_exists('Google_AnalyticsService', FALSE)) { 
         require_once __DIR__.'/google-api-php-client/src/contrib/Google_AnalyticsService.php';
     }
     $client = new Google_Client();
     $client->setApplicationName('Google Analytics PV counter widget');
     $client->setClientId($option['clientid']);
     $client->setClientSecret($option['clientsecret']);
     $client->setRedirectUri($option['redirect']);
     $client->setDeveloperKey($option['apikey']);
     $client->setScopes(array('https://www.googleapis.com/auth/analytics.readonly'));
     $client->setUseObjects(true);
 }

 

以上、OAuth2.0 認証(Google APIs Client Library for PHP)の注意点を紹介しました

次は、アナリティクスデータ取得の注意点について紹介する予定です (^^)


まとめ記事紹介

go-to-top