我正在使用WordPress REST API构建密码更改表单 . 用户输入一个新密码,然后通过AJAX提交给自定义 endpoints ,该 endpoints 执行以下操作:
$userID = get_current_user_id();
wp_set_password($password, $userID);
//Log user in and update auth cookie
wp_set_current_user($userID);
wp_set_auth_cookie($userID);
//Set the cookie immediately
$_COOKIE[AUTH_COOKIE] = wp_generate_auth_cookie($userID, 2 * DAY_IN_SECONDS);
//Return fresh nonce
return new WP_Rest_Response(array(
'nonce' => wp_create_nonce('wp_rest')
));
endpoints 应自动将用户登录并返回新的nonce,以便他们不必再使用新密码登录 .
问题是返回的nonce完全相同且无效 . 我只能在页面刷新后获得新的nonce . 似乎WordPress依赖于生成随机数的一些 $_COOKIE
或 $_SESSION
变量在页面刷新之前不会更新 .
谢谢你的帮助 .
2 回答
是的,它是LOGGED_IN_COOKIE,默认为:
看一眼:
$token = wp_get_session_token(); in
wp_create_nonce()
$cookie = wp_parse_auth_cookie( '', 'logged_in' ); in
wp_get_session_token()
$cookie_name = LOGGED_IN_COOKIE; in
wp_parse_auth_cookie()
所以你为了这个目的而使用
wp_generate_auth_cookie()
;而是使用wp_set_auth_cookie()
已经生成的内容..这一个:
Working Example (在WordPress 4.9.5上测试过)
PHP / WP REST API
HTML / The form
jQuery / AJAX
您需要使用AJAX请求通过
X-WP-Nonce
标头传递nonce . 就像是:localizedScript
是你的nonce本地化的脚本 . 有关本地化的更多信息,请参阅codex . Note 不需要localizedScript
方法 .如果没有
localizedSript
,您的AJAX可能类似于以下内容:显然,复制上面那个确切的脚本不会让你完成它,但这实际上是你需要成功传递nonce的方法 .