我了解在创建自己的模板时使用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。
我错过了什么?
答案 0 :(得分:3)
当您致电$my_nonce = wp_create_nonce('wp_rest');
时,即使您拨打wp_set_auth_cookie
和wp_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' );