2013年11月21日木曜日

nodejsからPHPを実行してWordPressのユーザー認証

nodejs_wordpress-usernodejsを使って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 >

コメントを投稿
Related Posts Plugin for WordPress, Blogger...

Blog Archives