0

我已经使用 jQuery mobile 和 PhoneGap 构建了一个应用程序。该应用程序使用 ajax 和 Wordpress json 插件从 Wordpress 网站获取内容。

现在我希望扩展应用程序的功能,让用户可以更新内容。

为此,他们必须登录 wordpress。

我打算让它像这样工作:

  1. 使用ajax从客户端发送到服务器的用户名和密码
  2. 将令牌从服务器返回给客户端
  3. 将令牌存储在客户端(本地存储)
  4. 将该令牌与每个请求一起发送到服务器并在服务器端验证它。

编辑: 到目前为止,我得到了这个来创建令牌并返回它:

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,是否有某种方法可以加密密码?

4

2 回答 2

0

如果登录成功,您需要使用wp_set_auth_cookie( $user->ID );来设置所有后续请求都将使用的身份验证 cookie。

于 2014-03-20T06:21:37.787 回答
0

创建一个定义几个新 URL 的自定义插件。一个 URL / 功能是登录并返回一个有效的令牌(如果是有效的登录)。另一个 URL / 功能是验证令牌是否仍然有效。

通过将其作为您自己的自定义插件,您还可以选择创建一个单独的角色/功能,您可以将其用于此目的......如果需要粒度。

于 2013-10-21T16:32:16.100 回答