-オープンソースのSNSエンジン OpenPNEプロジェクト-

OpenPNE 3.1 機能紹介 #3 – OAuth

09 / 12 土曜日 2009

開発チームの海老原です。

3.1 機能紹介シリーズ第三弾です。今回は OpenPNE 3.1.2 から新しく対応した OAuth について紹介します。

OAuth とは

SNS 内データのように保護されたリソースへの API を使ってアクセスする場合に有用なアクセス制御の仕組みです。

OAuth 登場以前は API を使用する外部アプリケーションなどに利用者の ID やパスワードを預けなければなりませんでした。 ID とパスワードを預けるということは、そのサイトにおける全権限を与えてしまうことに等しいというだけでなく、その ID とパスワードを他サービスと共用していた場合、そのサービスについても不正利用される危険が常につきまとうということになります。

OAuth ではデータにアクセスするために ID やパスワードとまったく紐付かないトークンを使用します。このトークンは、認証済みのユーザから使用を許可されたもので、あらかじめ許可されている API へのアクセスしかおこなえません。また、このトークンが不正利用された場合はいつでも破棄することができます。

SNS が OAuth に対応することで、安心して外部のアプリケーションを利用することができるようになります。

OAuth 対応アプリケーションを作る

OAuth に対応したアプリケーションを作るには、まず、 SNS への申請が必要です。

アプリケーションはメンバー画面と管理画面の両方からおこなうことができます。

ここではメンバー画面の例を示します。

まず、 SNS の設定変更画面 (/member/config) にアクセスします。メニューに「外部サービスとの接続設定」という項目があるので、それをクリックします。

pictureefbc882009-09-11-154734efbc89

「アプリケーションの追加」リンクをクリックします。

pictureefbc882009-09-11-154926efbc89

アプリケーション情報の登録を促されるので、必要な情報を入力します。使用する API は、アプリケーションが使用する予定の API をすべて選択します。ここで選択されなかった API は使用することができません。

pictureefbc882009-09-11-155006efbc89

アプリケーションの情報が表示されます。これで、このアプリケーションがこの SNS で使用できるようになりました。

pictureefbc882009-09-11-155129efbc89

この画面で表示される Consumer key と Consumer secret はアプリケーションを特定するために使用される情報です。これは絶対に公開しないでください。

実際に WebAPI にアクセスしてみる

では、実際にアプリケーションから OAuth を使って WebAPI にアクセスします。

OAuth のフロー

OAuth は以下のようなフローで認可処理をおこないます。

oauth_flow_ja

コーディング

それでは実際にコーディングに入ります。

OAuth のフローは単純なため、署名部分を除いては自分で書くこともできますが、 OpenPNE でより楽に OAuth を扱うためのライブラリを作成しました。(このライブラリは Apache2 Lisence として提供します。ご自由にお使いください)

OpenPNE3 用 OAuth ライブラリ (Gist) ※このコードは気が向き次第改良を加えていきます

また、このライブラリは PHP で OAuth を扱うための以下のライブラリに依存します。こちらも忘れずに入手してください。
http://oauth.googlecode.com/svn/code/php/

以下に、このライブラリを使って OpenPNE の OAuth を利用する手順を示します。

コンシューマの設定をする

ライブラリを使用するために、コンシューマに関する簡単な情報を設定する必要があります。

OpenPNEOAuth::getInstance() メソッドに、 SNS の URL とコンシューマキーとコンシューマシークレットを引数として指定します。

OpenPNEOAuth::getInstance($url, $consumerKey, $consumerSecret)

これでコンシューマ情報の登録は完了です。

以降は、OpenPNEOAuth::getInstance() を引数なしでコールし、 OpenPNEOAuth のインスタンス経由で各種メソッドを使用できるようになります。

リクエストトークンを取得する

リクエストトークンを取得するには、 OpenPNEOAuth::getRequestToken() メソッドをコールバック URL 付きでコールします。この URL は、認可後にユーザが戻ってくる外部アプリケーションの URL です。 URL を持たないデスクトップアプリケーションなどの場合は、文字列 “oob” を指定してください。

OpenPNEOAuth::getInstance()->getRequestToken('http://example.com/')

このメソッドは、リクエストトークン取得用の URL にアクセスした際のレスポンス本文をパースし、連想配列にしたものを返します。 oauth_token というキーでリクエストトークンの値が、 oauth_token_secret というキーでトークンに紐付いたシークレットの値が格納されています。

認可用 URL を取得し、リダイレクトさせる

メンバーが認可をおこなうページへの URL を取得するには、 OpenPNEOAuth::getAuthorizeUrl() メソッドをコールします。このメソッドは、 OpenPNEOAuth::getRequestToken() の返り値のように、 oauth_token というキーの要素を持つ連想配列を引数に取ります。

$url = OpenPNEOAuth::getInstance()->getAuthorizeUrl($token)

OpenPNEOAuth::getRequestToken() の返り値は、認可用ページの URL を表す文字列です。この URL に対して、リダイレクトなどの方法によってメンバーを誘導します。

header('Location: '.$url);

認可されたリクエストトークンを使ってアクセストークンを取得する

メンバーが認可をおこなったあとは、リクエストトークンを取得する際に指定した URL に戻ってきます。この際、リクエストトークンが oauth_token というパラメータで、確認用コードが oauth_verifier というパラメータで渡されているので、これを元にアクセストークンを取得します。

アクセストークンを取得するには、 OpenPNEOAuth::getAccessToken() メソッドを、認可済みリクエストトークンと確認用コードを引数に指定してコールします。

$token = OpenPNEOAuth::getInstance()->getAccessToken($_GET['oauth_token'], $_GET['oauth_verifier'])

OpenPNEOAuth::getAccessToken() の返り値は、 OpenPNEOAuth::getRequestToken() と同様に、レスポンス本文をパースし連想配列にしたものです。oauth_token というキーでアクセストークンの値が、 oauth_token_secret というキーでトークンに紐付いたシークレットの値が格納されています。

OAuth に対応した API の URL に対して、アクセストークン付きでアクセスする

OpenPNE3 で利用できる OAuth に対応した API には、現時点で OpenPNE Web API があります。

たとえばこの API でメンバーの情報を取得する場合、 http://sns.example.com/api.php/feeds/member/1 に GET でリクエストします。

このような場合は OpenPNEOAuth::doOAuthGet() メソッドが利用できます。 OpenPNEOAuth::doOAuthGet() は、 リクエスト対象の URL、 OpenPNEOAuth::getAccessToken() で得られるアクセストークンが格納された連想配列を引数に指定します。

$token = OpenPNEOAuth::getInstance()->doOAuthGet('http://sns.example.com/api.php/feeds/member/1', $token)

POST, PUT, DELETE メソッドによるリクエストもサポートしています。

POST と PUT はそれぞれ OpenPNEOAuth::doOAuthPost(), OpenPNEOAuth::doOAuthPut() というメソッドで扱えます。これらのメソッドはリクエスト対象の URL、リクエスト本文の文字列(OpenPNE Web API の場合は XML 文書)、アクセストークンが格納された連想配列を引数に取ります。

DELETE の場合は OpenPNEOAuth::doOAuthDelete() というメソッドを使用します。このメソッドの引数は OpenPNEOAuth::doOAuthGet() と同様、 リクエスト対象の URL、 OpenPNEOAuth::getAccessToken() で得られるアクセストークンが格納された連想配列です。

実際のサンプルコード

手順通りにライブラリを使用して、できあがったサンプルコードを以下に示します。

このコードは OAuth を使用した外部アプリケーション開発に必要な手順を示すための最低限のサンプルでしかありません。このコードは XSS 攻撃や変数汚染攻撃などに対して脆弱です。絶対にこのまま使用しないでください。

詳細な情報を得るには

OAuth の仕様書である OAuth Core 1.0 Revision A をご覧ください。

また、 OpenPNE3 で OAuth を使うためのドキュメントを現在作成中です(日本語版、英語版)。現時点ではかなり荒削りですが、参考資料としてはお使いいただけると思います。

コメント:1

tokumoto tomio 10-11-19 (金) 2:52

OpenPNE-3.6で$result = OpenPNEOAuth::getInstance()->doOAuthGet(BASE_URL.’api.php/feeds/member/1′, $token);で認証されません

ページの先頭に戻る