nodejsからPHPを実行してWordPressのユーザー認証
nodejsを使ってiPhone, Androidアプリ用のRest APIを開発する際に、WordPressのデータベースを使ったユーザー認証をしたかったので調査。
環境: CentoOS 5.10, node.js 0.10.21, php 5.4.21
最初はPHPでやっていることをJavaScriptで再現しようとしたけど、ソースコードを読んで無理そうだと諦めた。
なので、nodejsからPHPを外部コマンドとして呼び出して返り値を受け取ることにした。
nodejsから外部コマンドを実行するのは"child_process"を使うらしい。
nodejsから実行するPHPファイル。
wp_checkpassword.php
<?php
/**
* WordPress Check Password for CommandLine
*
* @usage
* # php wp_checkpassword.php --hash="hash" --password="password" --path="/path/to/wordpress"
*/$options = getopt(null, array('hash:', 'password:', 'path:'));
//
// Validation
//
if (empty($options['hash']) ||
empty($options['password']) ||
empty($options['path'])) {
exit('option error');
}
//
// @see wp-includes/pluggable.php line:1448
//
$check = false;
require_once($options['path'] . 'wp-includes/class-phpass.php');
// By default, use the portable hash from phpass
if ($wp_hasher = new PasswordHash(8, true)) {
$check = $wp_hasher->CheckPassword($options['password'], $options['hash']);
}echo json_encode($check);
?>
このPHPファイルを呼び出す側。
var command = [];
var process = require('child_process');
// Get the Password Hash from Database.
var user_pass = '$P$BpIMHINnR/9y.e90cMuY3Af0eIWZ6Z1';command.push('php');
command.push('php/wp_checkpassword.php');
command.push('--hash="' + user_pass.replace(/\$/g, '\\$') + '"');
command.push('--password="' + pass + '"');
command.push('--path="' + config.wordpress.path + '"');process.exec(command.join(' '), function (err, stdout, stderr) {
stdout = JSON.parse(stdout);
if (stdout) {
console.log('Login Success!');
}
});
「user_pass」はPOSTされたユーザーID(メールアドレス)からSQLを実行してwp_users.user_passを取得してくる必要あり。
取得したハッシュ値はそのままだと「$」の部分をLinuxのシェルが解釈してしまうのでエスケープする。
< 2014/01/07 Modified >
送信するパラメータをシングルクォーテーションで囲めば「$」をエスケープする必要はない。
command.push('--password=\'' + pass + '\'');
JSON.stringifyした値も渡せるので、こっちの方が良さそう。
応用すればWordPressの便利関数を使える。
新規ユーザー登録や新規投稿などはWordPressにパイプした方が楽かもしれない。でも値の受け渡し方法を考えないといけないか。。。
< Related Posts >