在jQuery Mobile,PhoneGap应用程序中使用wordpress进行身份验证

时间:2013-10-21 15:27:27

标签: php ajax wordpress security jquery-mobile

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

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

为此,他们必须使用wordpress登录。

我打算像这样工作:

  1. 用户名&使用ajax
  2. 从客户端发送到服务器的密码
  3. 将令牌从服务器返回客户端
  4. 将令牌存储在客户端(本地存储)
  5. 将每个请求的令牌发送到服务器并验证它 服务器端。
  6. 修改 到目前为止,我得到了这个来创建令牌并将其返回:

    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,有没有办法加密密码?

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

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