WordPress 4.0 Cookie身份验证可避免发布帖子和页面时出现随机数错误

时间:2014-09-08 作者:LPH

Cookies are now tied to internal sessions in WordPress 4.0.

这意味着使用基本cookie身份验证的插件将遇到问题,因为发布帖子或页面(以及更新插件或核心)需要令牌。我已经在三个不同的网桥插件中看到了这一报告。

旧方法(在许多插件中使用)是wp_set_auth_cookie($user_id,0,0) 但这将不再有效。用户已登录到该网站,但具有正确角色的用户无法发布帖子或页面。相反,会返回一个nonce错误(“您确定要这样做吗?)

这是我尝试过的新代码(在许多其他尝试中),但仍然得到相同的nonce错误。

wp_set_auth_cookie( $user_id, 0, 0 );
$manager = WP_Session_Tokens::get_instance( $user_id );
$token = $manager->create( $expiration );
为了解决此问题,暂时将wp\\u verify\\u nonce设置为始终返回1。但是,我想知道如何在cookie集上创建令牌。

有人克服了这个问题吗?既然这是WP的所有新代码,有人有什么建议吗?

更新:今天晚上花了几个小时再次研究这个问题。。。我意识到Zend_Debug::dump($_COOKIE); 可能会有帮助。果然,两个cookie中的字符串不匹配。

这两个字符串在hmac中不匹配。

\'wordpress\\u logged\\u in\\u 4ed466320671a355e05b9bf211271dd6\'

\'wordpress\\u 4ed466320671a355e05b9bf211271dd6\'

有趣的是,如果我Zend_Debug::dump($cookie_elements[\'hmac\']); 返回的字符串与wordpress\\u 4…匹配。。。。值,而不是wordpress\\u logged\\u。

不匹配会导致nonce错误。

3 个回复
SO网友:Igor Yavych

实际上,只是做了这个检查就解决了这个问题。

if(!is_user_logged_in())
{
    wp_set_current_user($userid);
    if(wp_validate_auth_cookie()==FALSE)
    {
        wp_set_auth_cookie($userid, true, false);  
    }                            
}   
似乎已解决此问题。

@在这里,您提出的解决方案对我不起作用,只是在尝试进入仪表板时将我重定向到登录页面

SO网友:here

修订:在添加了一个早期测试以避免尝试重新登录已登录的用户后,我能够完全删除所有会话和cookie处理,并依靠对wp_set_current_user

祝你好运

到目前为止,这为我解决了这个问题,并使用了新的WP_Session_Tokens 类更新当前用户的会话和令牌。

之前的代码保留内联,但被注释掉了。

感谢LPH的指点,非常感谢。

$username = \'username\';

// Edge case handles when plugin is activated and still logged in as old user.
// wp_clear_auth_cookie();

// Setup new user.
$user = wp_set_current_user($user_id, $username);

// wp_set_auth_cookie($user_id, 1);

// Required for WP 4.0
// https://core.trac.wordpress.org/ticket/20276
// $sessionManager = WP_Session_Tokens::get_instance( $user_id );
// $token = $sessionManager->create(time() + (1 * 24 * 60 * 60));
// $session = $sessionManager->get($token);
// $sessionManager->update($token,$session);

SO网友:LPH

身份验证是通过创建wp_validate_auth_cookie 函数并调用它。

if ( ! function_exists( \'wp_validate_auth_cookie\' ) ) :

function wp_validate_auth_cookie( $cookie = \'\', $scheme = \'\' ) {

    if ( XenWord::getVisitor()->getUserId() != 0 ) {
        return XenWord::getVisitor()->getUserId();
    }

    return false;
}

endif;
然后在代码的登录部分调用此替换。

    $current_user = get_userdata( $user_id );

    wp_set_current_user( $user_id );

    wp_validate_auth_cookie($cookie = \'\', $scheme = \'\');

    // Check to determine if adding XF users to WP database
    XenWord_XF_Users::check_options();

    return $current_user;
缓存插件现在又可以工作了。

结束