我们有一个小型web应用程序,允许用户登录(通过WordPress)并保持登录状态,最多15分钟,以达到安全目的。因为大多数会话将持续更长的时间,所以我有一个小的ajax调用,它是在每次单击html文档本身时进行的。
ajax调用本身激发到/admin-ajax.php
文件,它会命中一个函数(在functions.php中)。以下是该功能:
function extend_my_session_yo(){
$user_id = get_current_user_id();
wp_set_auth_cookie($user_id, false, true);
$new_logout = wp_logout_url();
if ( is_user_logged_in() ) {
echo \'session extended 15 mins \' . $new_logout;
}
// if a user is *not* logged in, Wordpress just outputs a "0".
die();
}
The
wp_set_auth_cookie()
做艰苦的工作。它正确地允许(每次单击)延长15分钟的会话。问题是如果有人试图注销。当前注销链接通过
wp_logout_url()
, 但该注销url从WordPress创建之时起就有一个nonce。
因此,在上面的函数中,我正在生成一个新的注销url(从WP核心代码来看,这似乎是通过从新的cookie中获取会话令牌生成的),但每次单击新的注销url都会显示Wordpress失败通知页面,指示暂时不匹配。我甚至从pluggable复制了代码。php(用于wp_verify_nonce()
) 用于检查hash_equals()
功能$expected
vs公司$nonce
他们是平等的。但我仍然会遇到暂时的错误。
有人知道如何在cookie中设置新的auth/logged\\u,同时设置新的nonce以避免这些错误吗?
最合适的回答,由SO网友:Jörn Lund 整理而成
你的问题是你打电话wp_logout_url
紧接着wp_set_auth_cookie
.
wp_set_auth_cookie()
做一些setcookie()
呼叫。不幸地setcookie
不会使新值在PHP全局中立即可用$_COOKIE
. 必须首先通过新的HTTP请求进行设置。
wp_logout_url()
(通过wp_nonce_url
> wp_create_nonce
> wp_get_session_token
> wp_parse_auth_cookie
) 获取$_COOKIE[LOGGED_IN_COOKIE]
为了创建有效的nonce,不知道登录的cookie已经更新。(我不太确定我们是否可以称之为WP核心bug。)
有一个动作挂钩wp_set_auth_cookie
已命名set_logged_in_cookie
, 这应该允许您在ajax请求期间更新会话cookie值。
function my_update_cookie( $logged_in_cookie ){
$_COOKIE[LOGGED_IN_COOKIE] = $logged_in_cookie;
}
add_action( \'set_logged_in_cookie\', \'my_update_cookie\' );