REST API:WP_GET_CURRENT_USER未在第二次调用中工作

时间:2016-09-05 作者:Balessan

我正在进行一个多步骤的注册过程,现在我遇到了一个问题。我试图实现的是让第一个电话发送用户注册所需的信息,以便创建他并让他登录,然后在第二步要求他更新之前随机生成的密码。所有操作都是使用AJAX和Wordpress REST API完成的,因此不需要重新加载页面。我观察到的是,我的第一步是正确地生成一个用户并使用以下代码记录他:

$password = wp_generate_password();
$userdata = array(
      \'user_login\'   => $email,
      \'user_email\'   => $email,
      \'user_pass\'    => $password,
      \'display_name\' => $firstname . \' \' . $name,
      \'first_name\'   => $firstname,
      \'last_name\'    => $name,
      \'role\'         => \'subscriber\',
      \'user_registered\' => (new \\DateTime())->format(\'Y-m-d H:i:s\')
);
$user_id = wp_insert_user( $userdata ) ;

// Autologin after registration
wp_set_current_user($user_id);
if (wp_validate_auth_cookie()==FALSE)
{
     wp_set_auth_cookie($user_id, true, false);
}
但是打电话wp_get_current_userglobal $current_user 在更新生成密码的附加步骤期间,仅检索0。代码:

$response = null;
$current_user = wp_get_current_user();
var_dump( $current_user );
退货:

object(WP_User)#3217 (7) {
 ["data"]=>
   object(stdClass)#3218 (0) {
   }
 ["ID"]=>
   int(0)
 ["caps"]=>
   array(0) {
   }
 ["cap_key"]=>
   NULL
 ["roles"]=>
   array(0) {
   }
 ["allcaps"]=>
   array(0) {
   }
 ["filter"]=>
   NULL
}

你知道为什么吗?这是正常行为吗?作为参考,我使用cookie身份验证,因为调用我的用户API的Javascript代码嵌入到我的自定义主题中。

提前感谢,

1 个回复
最合适的回答,由SO网友:Balessan 整理而成

在对超级复制程序Wordpress的核心功能进行了一整天的挖掘和调试之后,我意识到主要的问题是,用于创建和验证nonce的会话令牌是不等价的。我尝试了不同的方法,结果打电话给wp_set_auth_cookie 方法指定“logged\\u in”cookie目标。

然后,我想到了这个话题:Extend Wordpress (4.x) session and nonce 这家伙似乎有着和我一样的问题。

我试了一下,在课堂上加入了以下动作:

/**
 * login_force_update_cookie - Specific action for force overriding the logged_in_cookie
 * when being in the AJAX registration context
 *
 * @param  {type} $logged_in_cookie description
 * @return {type}                   description
 */
public function login_force_update_cookie( $logged_in_cookie ) {
  if ( strstr( $_SERVER[\'REQUEST_URI\'], \'toto/user/register\' ) ) {
    $_COOKIE[LOGGED_IN_COOKIE] = $logged_in_cookie;
  }
}
修改一点我的代码,如下所示:

wp_set_current_user($user_id);
if ( wp_validate_auth_cookie( \'\', \'logged_in\' ) != $user_id )
{
   wp_set_auth_cookie( $user_id );
}

// Storing the regitration event for the user
$this->saveLoginEvent( $user_id );
$data = array(
   \'user_id\' => $user_id,
   \'nonce\'   => wp_create_nonce( \'wp_rest\' ),
   \'message\' => \'user_created\'
);
$response = rest_ensure_response( $data );
这似乎解决了主要问题,即第一个AJAX响应中生成的nonce与第二个AJAX响应中验证的nonce之间的不一致性。的问题wp_get_current_user 返回0的原因是,当nonce不正常时,wordpress默认将用户设置为0。

这是一个相当棘手的问题,我学到了很多!

感谢您的关注,