PHP で OAuth Consumer Request (2-legged OAuth)

前に「OAuth Consumer Request の処理フローと実装」で紹介した 2-legged OAuth 処理のPHP版です。

通常の OAuth では、ユーザの確認画面を間に挟んでトークンのやり取りを行いますが、OAuth Consumer Request は既に信頼関係にあるという前提でトークン発行、承認の手順を省いたものです。コンシューマとサービスプロバイダ二者間での信任フロー(2-legged OAuth)になります。詳しい仕様については下記を参照してください。

» OAuth Consumer Request 1.0 Draft 1

まずは、実際の処理手順を説明していきましょう。コンシューマは次のパラメータをサービスプロバイダに送信することになります。 Consumer Key と Consumer Secret については、サービスプロバイダから提供されているものを使います。

oauth_consumer_keyコンシューマキー
oauth_signature_methodHMAC-SHA1 or RSA-SHA1
oauth_signatureシグニチャ
oauth_timestampUNIXタイムスタンプ
oauth_nonceランダムな文字列
oauth_version1.0 (オプション)

ここで、 oauth_signature は以下のようにして生成されます。まず、ベース文字列を用意します。

  1. GET
  2. http://api.gu3.jp/v1/test/auth
  3. oauth_consumer_key=yamashita.dyndns.org&oauth_nonce=c83b1847200
    bd25d918c3fb077aca16f&oauth_signature_method=HMAC-SHA1&
    oauth_timestamp=1219931263&oauth_version=1.0

次にこれらをURIエスケープした後に & で連結して、ベース文字列を生成します。

GET&http%3A%2F%2Fapi.gu3.jp%2Fv1%2Ftest%2Fauth&oauth_consumer_key
%3Dyamashita.dyndns.org%26oauth_nonce%3Dc83b1847200bd25d918c3fb0
77aca16f%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp
%3D1219931263%26oauth_version%3D1.0

そして、このベース文字列を HMAC-SHA1 によってダイジェスト値を生成し、BASE64 でエンコードすることによってシグニチャを生成します(サービスプロバイダによっては RSA-SHA1 の場合もあります)。この際、利用する共有キーは cosumer_secret と 空のToken Secret を & で連結したものになります。例えば、 consumer_secret が kd94hf93k423kf44 なら kd94hf93k423kf44& になります。こうして、シグニチャは以下のようになります。

M32qYtcaUD8b1Kb/AponRG5hrwI=

こうして生成されたパラメータをAPIリクエスト時の Authorization ヘッダに追加して、サービスプロバイダに送信します。

Authorization: OAuth realm="http://api.gu3.jp/",
               oauth_consumer_key="yamashita.dyndns.org",
               oauth_signature_method="HMAC-SHA1",
               oauth_signature="M32qYtcaUD8b1Kb%2FAponRG5hrwI%3D",
               oauth_timestamp="1219931263",
               oauth_nonce="c83b1847200bd25d918c3fb077aca16f",
               oauth_version="1.0"

実際のPHPスクリプトは次のようになります。なお、実行には Google Code にて公開されているPHP用ライブラリ(OAuth.php)が必要です。

<?php
require_once 'OAuth.php';
define('CONSUMER_KEY', 'yamashita.dyndns.org');
define('CONSUMER_SECRET', 'kd94hf93k423kf44');

function OAuthConsumerRequest($method, $url, $data=NULL) {
    $consumer = new OAuthConsumer(CONSUMER_KEY, CONSUMER_SECRET);
    $signature_method_hmac_sha1 = new OAuthSignatureMethod_HMAC_SHA1();

    // access protected resources
    $oauth_request = OAuthRequest::from_consumer_and_token($consumer,
                                                           NULL,
                                                           $method,
                                                           $url);
    $oauth_request->sign_request($signature_method_hmac_sha1,
                                 $consumer, '');

    $headers = $oauth_request->to_header();

    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_HTTPHEADER, array($headers));
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

    $result = curl_exec($ch);
    if ($result === FALSE) {
        return curl_error($ch);
    }
    curl_close($ch);
    return $result;
}

$ret = OAuthconsumerRequest('GET', 'http://api.gu3.jp/v1/test/auth');
print($ret);

ケータイ向け OpenSocial プラットフォーム「gumi Platform」

先日、モバイルSNS「gumi」が日本初となる携帯電話向けOpenSocialプラットフォームをリリースしました。実は、私もOpenSocialエンジン部分の開発に企画段階から関わっています。もともと gumi は、id:perezvon が Django で構築したサイトで、 OpenSocial エンジンの部分も Python で書いています。今回リリースされた gumi Platform の特徴としてはこんな感じです。

  • RESTful API ベースで JavaScript および IFRAME は使用しない(というか使えない)
  • APIへのアクセス制御には OAuth を採用
  • Viewer, Owner, Friends 情報を利用してソーシャル・アプリケーションを構築可能
  • 文字コードは UTF-8 を使用
  • 絵文字はドコモのUnicodeテキスト形式で記述し、他キャリア向けに自動変換
  • ホスティング環境として Google App Engine も利用可能(当然それ以外もOK)

下の画像を見てもらえれば、仕組みはイメージしてもらえると思いますが、携帯電話なので JavaScript が使えません。そこで、サードパーティ側から受け取った XML を gumi Platform 側で一枚の HTML にレンダリングして携帯電話に返すような構成になっています。

詳しくは、 Google Code にドキュメントがあるのでそちらを参照してください。

» gumi - Google Code

gumi Platformのリリースと前後して、2つほど検定/占い系のアプリも公開したのですが、一気にアクセスが来て大変な事になりました。やはりまだまだ世間はケータイなんだと実感しました。私も発売日に iPhone を手に入れたくちなのですが、使い勝手や安定性の点からいうと日本の携帯電話に一日の長がある感じがします。今は少し落ち着いたのですが、 Google App Engine のコンソールで見るとこんな感じです。

実際にソーシャルなアプリケーションを作ろうとすると、 OAuth の部分とかがかなり面倒くさいです。そこで、 Python 用には自動で OAuth 認証をして gumi API にアクセスするようなヘルパーライブラリを用意しています。他の言語用にも同様のライブラリも用意したいのですが、諸般の事情により今はそこまで手が回りません。

一番欲しいのはPHP用のライブラリなのですが。うーん、誰か作ってくれないかな…

iPhone 3G と Google カレンダーを自動プッシュで同期する NuevaSync

NuevaSync

しばらく前から NuevaSync を使って、iPhone のカレンダーと Googleカレンダーを同期しているのですが、これが大変便利です。MobileMe と同様にプッシュ式で OTA(over-the-air)同期させることができます。JailBreakの必要もなくて、しかも無料!! PCから Googleカレンダーに予定を入力すると、数分後には勝手に iPhone 上のカレンダーにも取り込まれているイメージ。もちろん、その逆もできて、出先でiPhoneに予定を入力して、会社や家に戻って PC から Googleカレンダーを見ると、新しい予定が反映されています。

Googleカレンダーだといろいろなサービスと連携できて使い勝手がいいので、年間9,800円も払って MobileMe に入る必要はないんじゃないかと思います。昔から同期フェチの僕は、Plaxoを使って、Googleカレンダー経由で Palm や携帯電話、その他のサービスと連携させています。今回、NuevaSyncのおかげでiPhoneをその仲間に加えることができました。現状の課題は、iPhone に標準搭載のカレンダーの使い勝手があまり良くないことでしょうか。Agendus 等のサードパーティ製品が出てくるのが待ち遠しいです。

それでは、実際に NuevaSync の設定方法を説明していきましょう。

1. NuevaSyncにユーザ登録する

まず NuevaSync のユーザ登録を行います。
ユーザ登録画面(Signup)を開いて、必要な情報を入力します。
※ここで入力するユーザ名とパスワードは、iPhoneからNuevaSyncへのアクセス用でGoogle用のID/パスワードを入力する必要はありません。

NuevaSync

入力したアドレスにメールが届くので、記載されているリンクをクリックして NuevaSync にログインします。

2. Googleアカウントの設定

ログイン後のメニュー画面にて Calendar の"change"をクリックして、「Google Calendar」を設定します。次に"setup"をクリックすると、Googleカレンダーのアカウントを聞かれるので、登録しているメールアドレスを入力します。

NuevaSync

すると、下の画面のように、アクセスを許可するかと聞かれるので、「Grant access」をクリックします。

NuevaSync

次のように Calendar のところが緑色に点灯すれば成功です。

NuevaSync

3. iPhone 側の設定

次に iPhone 側の設定を行います。
[設定]-[メール/連絡先/カレンダー]-[アカウントを追加]を開きます。

"Microsoft Exchange"を選択します。

NuevaSync

NuevaSyncのユーザ登録時に入力した、メールアドレス、ユーザ名、パスワードを入力します。ここで、「証明書を検証できません」と表示されますが、気にせずに「了解」ボタンを押します。

NuevaSync

「次へ」ボタンを押します。

「サーバ」欄に"www.nuevasync.com"と入力して、「次へ」ボタンを押します。

NuevaSync

利用するサービス選択画面では、カレンダーのみオンにして、それ以外はオフします。

NuevaSync

「保存」ボタンを押します。
"既存のカレンダーがiPhoneから取り除かれます"というメッセージが表示されるので、「同期」ボタンを押します。これはiPhoneの仕様のようで、プッシュ同期を有効にするとiTunes経由でのカレンダー同期が無効になります。(※ MobileMeのカレンダーとは共存可能なようです)

NuevaSync

4. 時間帯サポートの無効化

[設定]-[メール/連絡先/カレンダー]の画面に戻って、一番下の「時間帯サポート」を押します。ここで「時間帯サポート」をオフにします。

NuevaSync

以上で Googleカレンダーと iPhone の同期設定は完了です。試しに Googleカレンダーに予定を登録してみてください。数分後には、iPhone にも反映されるはずです。
私はまだ試していませんが、設定項目を見ると分かるとおり、カレンダーの他に連絡先の同期にも対応しています。 Email および ToDo については、今後対応予定とのことです。また、FAQページには、今後もずっと無料で提供すると書かれており、有料のプレミアムサービスも計画しているそうです。

おまけ