Javascript 在WordPress中使用ajax登录/注销脚本

Javascript 在WordPress中使用ajax登录/注销脚本,javascript,php,jquery,ajax,wordpress,Javascript,Php,Jquery,Ajax,Wordpress,我在ajax驱动页面的登录/注销脚本上遇到了一些问题 首先是场景: 该网站应该完全是ajax。在ajax请求中,只应更改内容和菜单。这对于普通页面和帖子来说很好,但是登录/注销会给我带来一些安全问题,比如wp\u create\u nonce和check\u ajax\u referer 以下是相关代码: functions.php /* Login */ function ajax_login_init() { wp_register_script('ajax-login-scrip

我在ajax驱动页面的登录/注销脚本上遇到了一些问题

首先是场景: 该网站应该完全是ajax。在ajax请求中,只应更改内容和菜单。这对于普通页面和帖子来说很好,但是登录/注销会给我带来一些安全问题,比如wp\u create\u nonce和check\u ajax\u referer

以下是相关代码:

functions.php

/* Login */
function ajax_login_init() {

    wp_register_script('ajax-login-script', get_stylesheet_directory_uri() . '/js/ajax.login.script.js', array('jquery') ); 
    wp_enqueue_script('ajax-login-script');

    wp_localize_script( 'ajax-login-script', 'ajax_login_object', array( 
        'ajaxurl' => admin_url( 'admin-ajax.php' ),
        'redirecturl' => home_url(),
        'loadingmessage' => __('Sending user info, please wait...')
    ));

    // Enable the user with no privileges to run ajax_login() in AJAX
    add_action( 'wp_ajax_nopriv_ajaxlogin', 'ajax_login' );
}

function ajax_login(){

    // First check the nonce, if it fails the function will break
    check_ajax_referer( 'ajax-login-nonce', 'security' );

    // Nonce is checked, get the POST data and sign user on
    $info = array();
    $info['user_login'] = $_POST['username'];
    $info['user_password'] = $_POST['password'];
    $info['remember'] = true;

    $user_signon = wp_signon( $info, false );
    if ( is_wp_error($user_signon) ){
        echo json_encode(array('loggedin'=>false, 'message'=>__('Wrong username or password.')));
    } else {
        echo json_encode(array('loggedin'=>true, 'message'=>__('Login successful, redirecting...')));
    }

    wp_die();
}

/** Logout */
function ajax_logout_init() {   

    wp_register_script('ajax-logout-script', get_stylesheet_directory_uri() . '/js/ajax.logout.script.js', array('jquery') );   
    wp_enqueue_script('ajax-logout-script');

    global $current_user;

    wp_localize_script( 'ajax-logout-script', 'ajax_logout_object', array( 
        'LoggedIn' => is_user_logged_in(),
        'username' => $current_user->display_name,
        'logoutURL' => wp_logout_url(),
        'ajax_url' => admin_url('admin-ajax.php'),
        'logout_nonce' => wp_create_nonce('ajax-logout-nonce')
    ));

    add_action( 'wp_ajax_ajaxlogout', 'ajax_logout' );  
}

function ajax_logout(){

    // First check the nonce, if it fails the function will break
    check_ajax_referer( 'ajax-logout-nonce', 'security' );
    //check_ajax_referer( 'ajax-logout-nonce', 'ajaxsecurity' );
    wp_clear_auth_cookie();
    wp_logout();
    ob_clean(); // probably overkill for this, but good habit
    wp_die();
}

add_action('init', 'ajax_login_init');
add_action('init', 'ajax_logout_init');
ajax.login.script.js

jQuery(document).ready(function($) {

    // Show the login dialog box on click
    $('body').on('click', '.modal-login a', function(e) {
        $('body').prepend('<div class="login_overlay"></div>');
        $('form#login').fadeIn(500);
        $('div.login_overlay, form#login a.close').on('click', function(){
            $('div.login_overlay').remove();
            $('form#login').hide();
        });
        e.preventDefault();
    });

    // Perform AJAX login on form submit
    $('form#login').on('submit', function(e){
        //console.log(ajax_login_object);
        $('form#login p.status').show().text(ajax_login_object.loadingmessage);
        $.ajax({
            type: 'POST',
            dataType: 'json',
            url: ajax_login_object.ajaxurl,
            data: { 
                'action': 'ajaxlogin', //calls wp_ajax_nopriv_ajaxlogin
                'username': $('form#login #username').val(), 
                'password': $('form#login #password').val(), 
                'security': $('form#login #security').val() },
            success: function(data){
                $('form#login p.status').text(data.message);
                if (data.loggedin == true){
                    //document.location.href = ajax_login_object.redirecturl;
                    $('div.login_overlay').remove();
                    $('form#login').hide();
                    $( ".logo a" ).trigger( "click" );
                }
            },
            error: function(xhr, status, error) {
                var err = eval("(" + xhr.responseText + ")");
                alert(err.Message);
            }
        });
        e.preventDefault();
    });

});
jQuery(document).ready(function($) {

    // Perform AJAX logout on Click
    $('body').on('click','.modal-logout a', function(e) {
        //console.log(ajax_logout_object);
        $.ajax({
            type: 'POST',
            url: ajax_logout_object.ajax_url,
            data: {
                'action': 'ajaxlogout',
                'ajaxsecurity': ajax_logout_object.logout_nonce,
            },
            success: function(data){
                console.log(data);
                $( ".logo a" ).trigger( "click" );
            },
            error: function(xhr, status, error) {
                var err = eval("(" + xhr.responseText + ")");
                alert(err.Message);
            }
        });
        e.preventDefault();
    });

});
如果我不使用该功能,登录/注销过程非常正常

check_ajax_referer( 'ajax-login-nonce', 'security' );
如果启用此代码,请检查\u ajax\u referer始终返回-1,但ajax查询将成功。从研究上看,目前的情况似乎无法得到证实

因此,如果我刷新了页面,我可以毫无问题地登录,但之后不能直接注销。我需要再次刷新页面(我不想因为连续的背景音乐)。注销和再次直接登录有相同的问题

下面是我的问题:

  • 我需要检查一下ajax和referer吗
  • 为什么我可以使用激活的check\u ajax\u referer登录,但不能在登录后直接注销(无需nee刷新页面)
  • 与2相同。但另一个方向
  • 提前谢谢
    您好,Bandicut

    我觉得这段代码是为我的博客编写的,所以让我帮助您解决这个问题

    由于您尚未发布表单标记,因此我不确定您的nonce
    action
    name
    参数是否匹配。用于在表单中创建隐藏的nonce字段的代码应完全如下所示:

    <?php wp_nonce_field('ajax-login-nonce', 'security'); ?>
    
    
    

    检查字段并更新我。

    我觉得这段代码用于我的博客,所以让我帮助您解决这个问题

    由于您尚未发布表单标记,因此我不确定您的nonce
    action
    name
    参数是否匹配。用于在表单中创建隐藏的nonce字段的代码应完全如下所示:

    <?php wp_nonce_field('ajax-login-nonce', 'security'); ?>
    
    
    

    检查该字段并更新我。

    为了清楚起见,对于“nonce”创建,您应该使用函数
    wp\u create\u nonce('your-secret-word'),您应该将其传递给数据对象中的“安全”密钥。然后,您应该用户
    检查\u ajax\u referer('yoursecretword','security')
    检查安全令牌是否正确。另外,在注销脚本中,您使用ajaxsecurity密钥,并且应该使用安全性,或者在检查令牌时-
    check_ajax\u referer('your-secret-word','ajaxsecurity')wp_create_nonce('your-secret-word'),您应该将其传递给数据对象中的“安全”密钥。然后,您应该用户
    检查\u ajax\u referer('yoursecretword','security')
    检查安全令牌是否正确。另外,在注销脚本中,您使用ajaxsecurity密钥,并且应该使用安全性,或者在检查令牌时-
    check_ajax\u referer('your-secret-word','ajaxsecurity')