我使用jQuery mobile和PhoneGap构建了一个应用程序。 该应用程序使用ajax和Wordpress json插件从Wordpress网站获取内容。
现在我希望扩展应用程序的功能,以便用户可以更新内容。
为此,他们必须使用wordpress登录。
我打算像这样工作:
修改 到目前为止,我得到了这个来创建令牌并将其返回:
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,有没有办法加密密码?
答案 0 :(得分:0)
创建一个定义了几个新网址的自定义插件。一个URL /功能是登录并返回有效令牌(如果是有效登录)。另一个URL /功能是验证令牌是否仍然有效。
将它作为您自己的自定义插件,您还可以选择创建可用于此目的的单独角色/功能...如果需要粒度。
答案 1 :(得分:0)
如果登录成功,您需要使用wp_set_auth_cookie( $user->ID );
来设置将由所有后续请求使用的身份验证Cookie。