注销时未销毁外部身份验证、会话令牌

时间:2016-05-05 作者:LPH

有很多问题和answers WordPress 4.0之前的外部身份验证和一些代码需要进行一些调整才能正常工作。例如,将第四个参数添加到wp_set_auth_cookie 将阻止一些奇怪的问题。然而,session\\u令牌不会被销毁,并且在每次登录后都会重复添加元值(导致一片混乱)。

为了让WordPress缓存插件正常工作,那么session\\u令牌需要正常工作:登录时创建,注销时销毁。

以下代码将登录外部数据库中的任何用户。

add_action( \'after_setup_theme\', \'xenword_login\', 10, 1 );

function xenword_login( $username ) {

add_filter( \'authenticate\', \'allow_programmatic_login\', 10, 3 );    // hook in earlier than other callbacks to short-circuit them
$user = wp_signon( array( \'user_login\' => $username ) );
remove_filter( \'authenticate\', \'allow_programmatic_login\', 10 );

    if ( is_a( $user, \'WP_User\' ) ) {

        wp_clear_auth_cookie();
        wp_set_current_user( $user->ID, $user->user_login );
        wp_set_auth_cookie( $user->ID, true, is_ssl(), true );

    if ( is_user_logged_in() ) {
        return $user->ID;
    }
}

return false;
}
然后在同一个文件中放置一个allow_prographic_登录。

function allow_programmatic_login( $user, $username, $password ) {

    $visitor = XenWord::getVisitor();
    $user_id = XenWord::getVisitor()->getUserId();

    if ( $user_id > 0 ) {
        $username = $visitor[\'username\'];
        return get_user_by( \'login\', $username );
    }
}
除了管理员、编辑器等无法进入仪表板之外,其他功能都很好,因为cookie不会被验证。更换wp_validate_auth_cookie 将使帐户具有访问权限,但缓存插件将无法正确加载。

经过几天(一年)的修补,我最近发现verify( $token ) 导致问题。

$manager = WP_Session_Tokens::get_instance( $user->ID );
if ( ! $manager->verify( $token ) ) {
    do_action( \'auth_cookie_bad_session_token\', $cookie_elements );
    return false;
}
这让我查看了数据库,发现session\\u令牌是在登录时创建的,而不是在注销时销毁的。

我的问题:是否有人发现并克服了这个问题,因为只需在帐户中使用以下日志,但没有创建session\\u令牌。

    wp_clear_auth_cookie();
    wp_set_current_user( $user_id, $user->user_login );
    wp_set_auth_cookie( $user_id, true, is_ssl(), true );

    do_action(\'wp_login\', $user->user_login );
这使我可以使用authenticate选项,但不会销毁session\\u令牌。有什么建议吗?

1 个回复
SO网友:LPH

下面是最后一段代码,可以让会话写入usermeta并在注销时删除。此代码适用于WordPress 4.5.2。该代码仅用于用户id信息。

add_action( \'after_setup_theme\', \'new_login\' );

function new_login() {

    $user_id = \'\'; // Change your code to grab user_id from external source

    if ( $user_id > 0 && ! is_user_logged_in() ) {
        $user = get_user_by( \'id\', $user_id );

        wp_clear_auth_cookie();
        wp_set_current_user( $user->ID, $user->user_login );
        wp_set_auth_cookie( $user->ID, true, is_ssl() );

        if ( is_user_logged_in() ) {
            return true;
        }

    } elseif ( $user_id == 0 && is_user_logged_in() ) {
        wp_logout();
        wp_set_current_user( 0 );
    }
}
有几个关键问题。首先,条件! is_user_logged_in() 必须包含在支票中user_id 大于零。接下来wp_set_current_user(0) 必须遵循wp_logout() 以避免刷新。

我希望这能帮助其他尝试仅使用user\\u id信息进行外部身份验证的人。