扩展WordPress(4.x)会话和随机数

时间:2015-02-26 作者:MikeTT

我们有一个小型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();
}
Thewp_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以避免这些错误吗?

1 个回复
最合适的回答,由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\' );

结束

相关推荐

具有$_SESSION变量的永久链接结构

我有一个项目,它的内容在整个网站上都被过滤(许多自定义WP\\U查询调用)。最初不需要URL,只需按$_SESSION 变量很好地工作,但现在客户端希望每个专业都加载一个自定义URL(很像类别)。我需要首先知道:Is it possible to make a permalink structure with the $_SESSION variable?如果是:How can I create a URL structure like this?Archive Page:http://domain.co