Wordpress Auth + Nonces + Ajax +无模板 - Cookie nonce无效

时间:2017-10-04 12:41:34

标签: ajax wordpress rest authentication nonce

我了解在创建自己的模板时使用nonce的过程。 但是我正在开发一个ReactJS应用程序,该应用程序仅使用Wordpress REST API来提取数据,因此用户永远不会访问index.php,但Ajax会调用WP Rest Api。

现在我无法让nonce工作了。 这是我到目前为止所做的:

我添加了以下端点:

register_rest_route('frontend', '/customer/', array(
    'methods' => 'GET',
    'callback' => 'get_customer'
));

register_rest_route('frontend', '/customer/', array(
    'methods' => 'POST',
    'callback' => 'create_user_and_login'
));

这些是我的功能:

function get_customer()
{
    return get_current_user_id();
}


function create_user_and_login(){
    // dummy data for testing
    $credentials = ['user_login' => 'mail@mymail.de', 'user_password' => 'XXXX', 'remember' => true];

    // create a new user/customer via woocommerce
    $customerId = wc_create_new_customer($credentials['user_login'], $credentials['user_login'], $credentials['user_password']);
    if(is_a($customerId,'WP_Error')) {
        return $customerId;
    }
    // get the user & log in
    $user = get_user_by( 'id', $customerId );
    if( $user ) {
        wp_set_current_user( $customerId);
        wp_set_auth_cookie( $customerId );
    }
    // create new nonce and return it
    $my_nonce = wp_create_nonce('wp_rest');
    return $my_nonce;
}

如果我现在对触发/customer的{​​{1}}运行POST,则会在ajax响应中返回新创建的nonce。然后我使用返回的nonce运行我的下一个请求,GET到create_user_and_login(),但是我收到错误:

/customer?_wpnonce=MY-NONCE

我查了the nonce documentation但我无法找到解决问题的方法。可能是会话不同步?那么nonce是在错误的会话上创建的,还是{ "code": "rest_cookie_invalid_nonce", "message": "Cookie nonce is invalid", "data": { "status": 403 } } wp_set_auth_cookie未被正确调用?或者我必须使用wp_localize_script功能吗?这会有问题,因为我希望将ReactJS和Wordpress后端分开。

POST后我有两个Cookie,一个wp_set_current_user Cookie和一个wordpress Cookie。

我错过了什么?

1 个答案:

答案 0 :(得分:3)

Check this answer

当您致电$my_nonce = wp_create_nonce('wp_rest');时,即使您拨打wp_set_auth_cookiewp_set_current_user,也会使用旧会话Cookie创建现时。但是在下一个请求中会话被更新,这意味着nonce是错误的。

在答案中,添加以下钩子(例如functions.php)以强制更新cookie:

        function my_update_cookie( $logged_in_cookie ){
            $_COOKIE[LOGGED_IN_COOKIE] = $logged_in_cookie;
        }
        add_action( 'set_logged_in_cookie', 'my_update_cookie' );