nkjmkzk.net

powered by Kazuki Nakajima

Archive for the ‘php’ tag

新しくなったForce.com OAuth Toolkit for phpの使い方

先日、Force.comのREST APIをphpから利用する際に便利なOAuth Toolkitを抜本的に書き直しました。新しくなってさらに簡単になったこのツールの使い方をご紹介しておきます。

まずはダウンロード。こちらからどうぞ。Webサーバの適当なディレクトリに保存してください。

https://github.com/nkjm/Force.com-OAuth-Toolkit-for-PHP

次に認証が必要なスクリプトにoauth.phpをインポートします。

$ vi index.php
require_once 'oauth.php';

同スクリプトでoauthクラスのインスタンスを作成します。

$oauth = new oauth(CLIENT_ID, CLIENT_SECRET, CALLBACK_URL, [LOGIN_URL], [CACHE_DIR]);
  • LOGIN_URLとCACHE_DIRはオプショナルです。
  • CACHE_DIRは認証後に発行されるaccess token, refresh token, instance urlを保存するためのディレクトリです。auth_with_password()を用いた場合のみ利用されます。

oauthのインスタンスメソッドでOAuth認証を実施します。認証には2通りあります。1つはアクセスコードを用いる方法で、ユーザごとに認証を要する場合に利用します。

$oauth->auth_with_code([LIFETIME]);

LIFETIMEはオプショナルで、アクセストークンをリフレッシュする間隔を分単位で指定できます。

もう1つはusername/passwordを用いる方法で、不特定のユーザからアクセスを受け付ける場合に利用します。HomePageのバックエンドとしてForce.comを接続し、問い合わせ情報などをForce.comに取り込みたい場合などに適しています。

$oauth->auth_with_password(USERNAME, PASSWORD);

USERNAME, PASSWORDはあるユーザをゲストアカウントと見たてて、その情報をセットします。

認証が成功すると$oauthには下記のパラメータにそれぞれaccess token, refresh token, instance urlの情報がセットされ、この情報を使ってREST APIにアクセスできます。

  • $oauth->access_token
  • $oauth->refresh_token
  • $oauth->instance_url

oauth_with_password()を使用する場合は事前にCACHE_DIRにしているディレクトリ(デフォルトではスクリプトと同じディレクトリ)が存在し、適切なパーミッションが設定されている必要があります。パーミッションはWebサーバプロセスのオーナーユーザー/グループの(一般的にはnobodyなど)からのRead/Writeアクセスが必要です。

OAuth Toolkitのセットアップと実行はこれだけです。

下記のサンプルコードで全体の流れをつかんでいただければ幸いです。

require_once "oauth.php";

// You have to change following paramenter depending on your remote access setting.
define('CLIENT_ID', '3MVG9rFJvQRVOvk40dRq5u_ZA0eT2KvZCvZq.XeA1hFtgc3PITGlLMp3V_kKIwtc6IaEGWkIO3cOu0IgVmujh');
define('CLIENT_SECRET', '1136279981407985294');
define('CALLBACK_URL', 'https://sugoisurvey.nkjmkzk.net');

$oauth = new oauth(CLIENT_ID, CLIENT_SECRET, CALLBACK_URL);
$oauth->auth_with_code();

$query = "select name from session__c";
$url = $oauth->instance_url . "/services/data/v24.0/query?q=" . urlencode($query);
$curl = curl_init($url);
curl_setopt($curl, CURLOPT_HEADER, false);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_HTTPHEADER, array("Authorization: OAuth " . $oauth->access_token));
$response = json_decode(curl_exec($curl), true);
$status = curl_getinfo($curl, CURLINFO_HTTP_CODE);
if ( $status != 200 ) {
    die("curl failed");
}
curl_close($curl);
return($response);

with 2 comments

Written by 中嶋 一樹

5月 15th, 2012 at 1:50 pm

Posted in Uncategorized

Tagged with , ,

php on heroku

愛して止まないphpをherokuで走らせるQuick Tutorial。(phpサポートは非公式です。)

前提条件

  • heroku CLIがインストールされていること

セットアップ手順

まずはローカルで適当なディレクトリを作成し、gitレポジトリを初期化。

$ mkdir myapp
$ cd myapp/
$ git init

index.phpを作成し(色気を出してtest.phpとか他のファイル名にしてはならない)、テストに適した王道スクリプトを記述。

$ vi index.php
<?php echo "Hello Salesforce.com!!"; ?>

gitレポジトリにコミット。

$ git add .
$ git commit -m 'my first commit'

heroku上にアプリを新規登録。stackにはcedarを指定。

$ heroku create --stack cedar
Creating growing-ice-9956... done, stack is cedar
http://growing-ice-9956.herokuapp.com/ | git@heroku.com:growing-ice-9956.git
Git remote heroku added

作成したアプリにレポジトリをプッシュ(アップロード)。

$ git push heroku master
Counting objects: 3, done.
Writing objects: 100% (3/3), 261 bytes, done.
Total 3 (delta 0), reused 0 (delta 0)

-----> Heroku receiving push
-----> PHP app detected
-----> Bundling Apache v2.2.19
-----> Bundling PHP v5.3.6
-----> Discovering process types
       Procfile declares types -> (none)
       Default types for PHP   -> web
-----> Compiled slug size is 21.5MB
-----> Launching... done, v4
       http://growing-ice-9956.herokuapp.com deployed to Heroku

To git@heroku.com:growing-ice-9956.git
 * [new branch]      master -> master

これだけ。ランダムに割り当てられたherokuapp.comサブドメインであなたのphpが動いています。今回だとhttp://growing-ice-9956.herokuapp.comですね。

herokuの管理画面ではこんな感じ。

 

まだ試してないですがWordpress on herokuとかもありますね。

https://github.com/mhoofman/wordpress-heroku

without comments

Written by 中嶋 一樹

2月 13th, 2012 at 10:03 pm

Posted in Uncategorized

Tagged with ,

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を覗けば大体見当はつくと思います。

without comments

Written by 中嶋 一樹

11月 7th, 2011 at 6:14 am

Posted in Uncategorized

Tagged with , , , ,

外部の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";

 

参考情報

with one comment

Written by 中嶋 一樹

11月 6th, 2011 at 3:39 pm

Posted in Uncategorized

Tagged with , , ,

phpからASMを管理するためのパッチ

phpからOracleを操作するときは一般的にoci8というAPI群を使います。Oracleに管理者としてログインする際、sqlplusだとconnect /as sysdbaするのはご存知の通りですが、このoci8からOracleに管理者権限接続する際には下記のようにOCI_SYSDBAというフラグを立てて接続することが必要です。
$conn = oci_connect('user', 'password', 'node/service', '', OCI_SYSDBA);
同様にASMに管理者としてログインする際、sqlplusだとconnect /as sysasmすることが必要ですが、このoci8からASMに管理者権限で接続するためのOCI_SYSASMというフラグがないということに気付きました。つまり、phpからASMを管理できないじゃないか、ということになります。
こりゃ困った、ということでいろいろ悩んだ結果、phpにOCI_SYSASM接続モードを勝手に実装することにしました。結果幸運にもphpのソースをちょこっといじるだけでOCI_SYSASM接続モードのサポートをphpに組み込むことができましたのでそれをパッチとして公開しておきます。
php-sysasm.patch
phpのバージョンは5.3.2に対応していますが、多分oci8ってそれほど更新されていないと思うので他のバージョンでもそれほど古くなければ適用可能じゃないかと思います。パッチ適用及びphpのビルド、インストールは下記の手順をご参考に(configureオプションは最小限ですので適宜追加してください)。
[root@~]# tar xvfj php-5.3.2.tar.bz2
[root@~]# cd php-5.3.2/ext/oci8/
[root@~]# patch < /PATH/TO/php-sysasm.patch
[root@~]# cd ../../
[root@~]# ./configure --with-oci8
[root@~]# make
[root@~]# make install

ASMインスタンスへの接続は下記のようにOCI_SYSASMフラグを指定して接続します。

$conn = oci_connect('user', 'password', 'node/service', '', OCI_SYSASM);

without comments

Written by 中嶋 一樹

6月 24th, 2010 at 7:34 am

Posted in Uncategorized

Tagged with , ,

Oracle DatabaseとphpでOPAL環境を構築する

昨日はOracle Database XEの紹介とインストール手順を解説しました。

今日はそのXEを使ってOPAL環境を構築したいと思います。OPALとはかなりマイナーな略式名称ですが、Oracle Database, PHP, Apache, Linuxで構成するWeb+DBのスタックのことです。いわゆるアレです、LAMP(Linux, Apache, MySQL, PHP)みたいなもんです。というか平たく言えばパクリでしょう。*ちなみに「P」はPHP,Python,Perlのどれか。

昨日まででLinuxとOracle Databaseのインストールは済んでいるという前提で、その同じマシンにApacheとPHPをインストール/セットアップしていきましょう。それぞれ今日現在で最新のhttpd-2.2.10とphp-5.2.8を使用します。

まずはApacheですがこれは簡単、というかとくにOPALだからといって特別な手順やオプションはありません。普通にコンパイルしてインストールします。

# tar xvfj httpd-2.2.10.tar.bz2
# cd httpd-2.2.10/
# ./configure ¥
--prefix=/srv/httpd ¥ #適当に置き換えてください
--enable-so #多分デフォルト有効なのでいらないと思われますが一応
# make
# make install

終了ーー。では次にphpのインストールへ。

# tar xvfj php-5.2.8.tar.bz2
# cd php-5.2.8/

次のコンフィグが結構ミソです。phpからOracleに接続するにはOCI (Oracle Call Interface) を使うのが一般的かつ、性能面、機能面で最適な方法と言われています。ただしこれにも2種類あって、PDO_OCIと普通のOCI8というのがあります。実際、よりup-to-dateなドライバはOCI8になります。PDO_OCIの方はMySQLやPostgreSQLに接続する際でも統一されたインターフェースを提供してくれるいわゆる抽象化ドライバです。なので一見こいつをつかっといた方が後でDBを切り替えることがあった際に便利なのですが、残念ながら最近このPDO_OCIはメンテナンスされておらず、OCI8で実装されているBugFixや機能拡張などが反映されていません。なのでOracle一筋な方は迷わずOCI8を選択してください。そしてこのOCI8を使用するにはコンフィグ時に--with-oci8オプションを指定しておく必要があります。ちなみにPDO_OCIの方は--with-pdo-ociとします。一応こいつも入れておいてやろう。

# ./configure ¥
--prefix=/srv/php ¥ #適当に置き換えてください
--with-apxs2=/srv/httpd/bin/apxs ¥ #Apacheをインストールした場所によって置き換えてください
--with-oci8=shared,/usr/lib/oracle/xe/app/oracle/product/10.2.0/server ¥ # $ORACLE_HOMEを指定します。
--with-pdo-oci=shared,/usr/lib/oracle/xe/app/oracle/product/10.2.0/server ¥ # 同じく$ORACLE_HOMEを指定します。
--with-gd ¥
--with-gettext ¥
--disable-short-tags ¥
--enable-pdo ¥
--enable-mbstring ¥
--enable-exif ¥
--enable-sigchild

これでOK。ビルドしていきます。

# make
# make install

これでバイナリがインストールされました。次に設定ファイルを作成します。テンプレートがあるのでそれをコピーして少しだけ編集(追記)します。

# cp php.ini-recommended /srv/php/lib/php.ini
# vi /srv/php/lib/php.ini
extension_dir=/srv/php/lib/php/extensions/no-debug-non-zts-20060613
extension=oci8.so

あと、httpd.confにも少し手を入れます。以下を最後の方にでも追記してください。

# vi /srv/httpd/conf/httpd.conf
AddType application/x-httpd-php .php 
AddType application/x-httpd-php .phtml 
AddType application/x-httpd-php-source .phps 

これでOKです。なお、今更ですがSE Linuxとかが有効になっているとphpのモジュールをロードする際にエラーになっていまうので/etc/selinux/configでSELINUX=disabledにしておいてください。もうこれで使える状態にあるのですが、実はこのphpのソースにバンドルされているOCI8は結構古かったりします。気持ち悪いので最新版にアップデートしておきたいところです。というわけでPECLから最新のソースをとってきます。

# wget http://pecl.php.net/get/oci8-1.3.4.tgz
# tar xvfz oci8-1.3.4.tgz
# cd  oci8-1.3.4/
# /srv/php/bin/phpize
# ./configure --with-oci8=shared,/usr/lib/oracle/xe/app/oracle/product/10.2.0/server
# make
# make install

これでばっちりです。最新のモジュールが/srv/php/lib/php/extensions/no-debug-non-zts-2006061にインストールされました。あとはapachectl startするだけです。ちなみに一応ちゃんとOCI8がインストールされているか確認するためにphpinfo()を活用しましょう。Apacheのドキュメントルートに以下の様にファイルを作成します。

# vi /srv/httpd/htdocs/phpinfo.php
<?php
phpinfo();
?>

そしてこのサーバにアクセスしましょう。


http://あなたのIPアドレス/phpinfo.php

するとこんな画面が出てくるはずです。

下の方にスクロールしていき・・・

ありましたね。よかったよかった。ひとまずこれでセットアップは完了です。

ちなみに今回のようなOPAL環境の構築について、佐藤さんがいち早く良いドキュメントを紹介されています。

http://www.oracle.com/technology/tech/php/pdf/underground-php-oracle-manual.pdf

英語にはなってしまうのですがこれははっきり言ってかなりの良書です。Oracle好きだけどJavaはちょっと、という僕のような人にはたまらない感じです。

with one comment

Written by 中嶋 一樹

12月 14th, 2008 at 7:49 pm

Posted in Uncategorized

Tagged with , ,