jQuery mobile と PhoneGap を使用してアプリを作成しました。このアプリは、ajax と Wordpress json プラグインを使用して、Wordpress Web サイトからコンテンツをフェッチします。
今、アプリの機能を拡張して、ユーザーがコンテンツを更新できるようにしたいと考えています。
このためには、ワードプレスにログインする必要があります。
私は次のように動作するつもりです:
- ajax を使用してクライアントからサーバーに送信されるユーザー名とパスワード
- サーバーからクライアントにトークンを返す
- トークンをクライアントに保存 (ローカル ストレージ)
- 各リクエストでそのトークンをサーバーに送信し、サーバー側で検証します。
編集: これまでのところ、トークンを作成して返すためにこれを取得しました:
add_action( 'wp_ajax_nopriv_ajaxlogin', 'ajax_login' );
add_action( 'wp_ajax_priv_ajaxlogin', 'ajax_login' );
function ajax_login(){
$info = array();
$info['user_login'] = $_POST['username'];
$info['user_password'] = $_POST['password'];
$info['remember'] = true;
$user = wp_signon( $info, false );
if ( is_wp_error($user) ){
echo json_encode(array('loggedin'=>false, 'message'=>__('Invalid username or password.')));
} else {
$expiration = $expire = time() + (14 * 24 * 60 * 60);
$pass_frag = substr($user->user_pass, 8, 4);
$key = wp_hash($user->user_login . $pass_frag . '|' . $expiration, $scheme);
$hash = hash_hmac('md5', $user->user_login . '|' . $expiration, $key);
$token = $user->user_login . '|' . $expiration . '|' . $hash;
echo json_encode(array('loggedin'=>true, 'token'=>$token, 'message'=>__('Login successful...')));
}
die();
}
そしてこれはトークンを検証するために:
function token_auth($token){
list($username, $expiration, $hmac) = $token;
$expired = $expiration;
// Allow a grace period for POST and AJAX requests
if ( defined('DOING_AJAX') || 'POST' == $_SERVER['REQUEST_METHOD'] )
$expired += HOUR_IN_SECONDS;
// Quick check to see if an honest cookie has expired
if ( $expired < time() ) {
return false;
}
$user = get_user_by('login', $username);
if ( ! $user ) {
return false;
}
$pass_frag = substr($user->user_pass, 8, 4);
$key = wp_hash($username . $pass_frag . '|' . $expiration, $scheme);
$hash = hash_hmac('md5', $username . '|' . $expiration, $key);
if ( $hmac != $hash ) {
return false;
}
if ( $expiration < time() ) // AJAX/POST grace period set above
$GLOBALS['login_grace_period'] = 1;
return true;
wp_set_current_user( $user->ID );
}
そして、jsは次のとおりです。
$('form#login').submit( function(e){
$('form#login p.status').show().text('Sending user info, please wait...');
$.ajax({
type: 'POST',
dataType: 'json',
url: 'http://example.com/wp-admin/admin-ajax.php',
username: $('form#login #username').val(),
password: $('form#login #password').val(),
data: {
'action': 'ajaxlogin',
'username': $('form#login #username').val(),
'password': $('form#login #password').val() },
success: function(data){
$('form#login p.status').text(data.message);
if (data.loggedin == true){
$.mobile.changePage( "/blog.html", { changeHash: false });
}
}
});
e.preventDefault();
});
まだ作業中です。
誰かが https を使用していない場合にパスワードを暗号化する方法はありますか?