Archive for 11月, 2011
JavaScriptからForce.com REST APIへアクセス
*このエントリーは「外部のphpからREST APIでForce.comにアクセスすためのOAuth Toolkit」の続きです。
JavaScriptからForce.com REST APIを使うにはForce.com JavaScript REST API Toolkitを使うのが近道です。今回は前回の外部php環境にこのToolkitを組み込んでみます。
本来はブラウザにダウンロードされたJavaScriptから直接リソースサーバ(Force.comでAPIを受けつけてデータアクセスを提供しているサーバ)にRESTアクセスできれば良いのですが、ブラウザのセキュリティ上そのままでは実行できません。ひとつの解はphp実行環境をプロキシとして利用することです。この形態であれば問題なくAPIにアクセスすることができます。
Force.com JavaScript REST API Toolkitではこの形態をサポートするためのproxy.phpを提供しています。これはphp実行環境に置いておけばそれだけでプロキシとして動作してくれるというなんとも便利なシロモノです。
まずはこのファイルをGithubからダウンロードしてドキュメントルート直下に配置します。
$ export DOCUMENT_ROOT='/srv/nginx/html/test' [なんらかの方法でproxy.phpをダウンロード] $ ls ${DOCUMENT_ROOT}/ proxy.php
次にToolkitの本体であるforcetk.jsをダウンロードして同じくドキュメントルート直下に配置します。
[なんらかの方法でforcetk.jsをダウンロード] $ ls ${DOCUMENT_ROOT}/ forcetk.js proxy.php
次にHTMLを生成してその中でforcetk.jsを読み込みます。また、forcetk.jsはjQueryを使用しているためjQueryも同様に読み込ませます。そして今回はAccountレコードを作成するJavaScriptを実装します。これらのHTML生成からJavaScriptライブラリの読み込み、Accountレコード作成処理までをindex.phpの中に記述していきます。(OAuthによる認証部分は実装されているものとします)
$ vi ${DOCUMENT_ROOT}/index.php <?php session_start(); if (!isset($_SESSION['access_token']) || !isset($_SESSION['instance_url'])) { $_SESSION['oauth_return'] = $_SERVER['PHP_SELF']; header( 'Location: oauth/oauth.php' ); } ?> <!DOCTYPE html> <html> <head> <meta http-equiv='Content-Type' content='text/html; charset=UTF-8'> </head> <body> <div id='account_form'> <input type='text' name='account_name' /> <input type='button' value='create new account' /> </div> <!--jQueryをロード--> <script src="http://code.jquery.com/jquery-1.7.min.js"></script> <!--forcetk.jsをロード--> <script src="forcetk.js"></script> <script type="text/javascript"> $(document).ready(function(){ var $client_id = "[あなたのConsumer ID]"; var $proxy_url = "https://[あなたのWebサーバ]/proxy.php?mode=native"; // REST APIアクセスを抽象化するWrapperを初期化 var client = new forcetk.Client($client_id, null, $proxy_url); // セッション情報をセット client.setSessionToken('<?php echo $_SESSION["access_token"]; ?>', null, '<?php echo $_SESSION["instance_url"]; ?>'); $('#account_form :button').click(function(){ var $account_name = $('#account_form :text').attr('value'); // createメソッドでAccountレコードを作成。第一引数はオブジェクト名。第二引数はフィールド。第三引数は成功時のコールバック。第四引数はエラー時のコールバック。 client.create( "Account", {"Name":$account_name}, function(response){ alert('Success!'); }, function(jqXHR){ alert(jqXHR.responseText); } ); }); }); </script> </body> </html>
ブラウザでWebサーバにアクセスし、フォームにAccountの名前を入力してボタンを押せばAjaxでAccount Recordの作成が実行されます。成功すればアラートウィンドが開き”Success!”と表示されるはずです。
Force.comの組織にログインして実際にAccountが作成されているか確認してみてください。
このToolkitの詳細なリファレンスに関してはドキュメントは見当たらなかったのですが、forcetk.jsを覗けば大体見当はつくと思います。
外部のphpからREST APIでForce.comにアクセスするためのOAuth Toolkit
2012.05追記
OAuth Toolkitはスクラッチから再開発されました。この記事は古いものです。
あたらしいOAuth Toolkitの使い方はこちら。
Force.comの外部にホストしているWebサービスからForce.comに対してREST APIでアクセスするためには認証が必要です。
自分でOAuth認証クライアントのコードをスクラッチから書くのはホネの折れる作業なので、php実行環境でのToolkitを作成してGithubに公開しておきました。
Force.com OAuth Toolkit for PHP
使い方をざっくりと説明します。
必要なもの
- Force.comの外部で稼動しているphp実行環境
- cURLがphp実行環境で有効になっていること
- JSONがphp実行環境で有効になっていること
- SSLがphp実行環境で有効になっていること
- アクセスするForce.comの組織
- APIがForce.com組織およびプロファイルで有効になっていること
インストールとセットアップ
php実行環境のドキュメントルートにoauthディレクトリを作成。
$ export DOCUMENT_ROOT='/srv/nginx/html/test' $ mkdir ${DOCUMENT_ROOT}/oauth
作成したoauthディレクトリ配下にGithubからoauth.phpとconfig.phpをダウンロードして保存。
[何らかの方法でoauth.phpとconfig.phpをダウンロード] $ ls ${DOCUMENT_ROOT}/oauth config.php oauth.php
Force.com側でRemote Accessレコードを作成。
[あなたの名前]->Setup->Develop->Remote Accessから。重要なのはCallback URL。下記のフォーマットで。プロトコルはHTTPSである必要があります。
https://[あなたのサーバ]/oauth/oauth.php
php実行環境のconfig.phpを編集してCLIENT_IDとCLIENT_SECRETを設定。それぞれの値はRemote Accessレコードを参照。
$ vi ${DOCUMENT_ROOT}/oauth/config.php <?php define("CLIENT_ID", "[あなたのConsumer Key]"); define("CLIENT_SECRET", "[あなたのConsumer Secret]"); define("LOGIN_URI", "https://login.salesforce.com"); ?>
認証が必要なphpファイルの最上部に下記を追記
# vi ${DOCUMENT_ROOT}/index.php <?php session_start(); if (!isset($_SESSION['access_token']) || !isset($_SESSION['instance_url'])) { $_SESSION['oauth_return'] = $_SERVER['PHP_SELF']; header( 'Location: oauth/oauth.php' ); } [あなたのコードが続く] ?>
これで完了。
ブラウザで認証が必要なコンテンツにアクセスすれば、未認証の場合は一度Salesforceのログインサイトにリダイレクトされます。そこで認証または認可を行い、リダイレクト元に再度リダイレクトされます。
その後のアクセスでは$_SESSION['access_token']にアクセストークンが、$_SESSION['instance_url']にインスタンスのURLが保存されますので、この2つをもってForce.comのREST APIをつつくことで認可済みの状態を維持することができます。
このOAuthのアクセストークンを用いてREST APIにアクセスするサンプルコードを最後に紹介しておきます。下記はChatterからFeedとその発信者を取得して表示するコードです。
$url = $_SESSION['instance_url'] . "/services/data/v23.0/chatter/feeds/news/me/feed-items"; $curl = curl_init($url); curl_setopt($curl, CURLOPT_HEADER, false); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); curl_setopt($curl, CURLOPT_HTTPHEADER, array("Authorization: OAuth " . $_SESSION['access_token'])); $json_response = curl_exec($curl); $response = json_decode($json_response, true); echo "<!DOCTYPE html><html><head><meta http-equiv='Content-Type' content='text/html; charset=UTF-8'></head><body>\n"; foreach ((array) $response['items'] as $feed) { echo $feed['actor']['name'] . " says \n"; echo $feed['body']['text'] . "<br/>\n"; } echo "</body></html>\n";