Mirgrating a user at signon

时间:2022-01-26 作者:StripyTiger

我正在将wordpress站点迁移到另一个站点。来自旧站点的用户需要使用新站点。我正在执行一个交错的实现,所以不想一次将所有用户都带来。

基本上,当用户尝试登录时,在登录验证之前,如果新站点上不存在该用户,我将使用api调用从旧站点获取用户详细信息,并在新站点上创建用户。

我正在使用wp\\u authenticate操作在对用户进行身份验证之前进行检查。这样就可以创建用户,然后进行身份验证。但身份验证失败。如果我再次尝试登录,它会正常工作,因此我知道凭据正常,所有数据都已正确写入。

感觉就像在服务器上的同一次旅行中,我无法创建用户和登录。

add_action( \'wp_authenticate\' , [$this,"preAuthenticate"],10,1);

public function preAuthenticate($username) {
    try {
        if (!filter_var($username, FILTER_VALIDATE_EMAIL)) {
            throw new \\Exception("Not an email address - carry on");
        }
        
        $usr = get_user_by("email", $username);
        
        if ($usr) {
            throw new \\Exception("Already a user - carry on");                
        }
        
        $this->getExternalUser($username);
        
    } catch (\\Exception $ex) {
        // no need to do anything
    }
}

private function getExternalUser($emailAddress) {
    try {
        $oldUser = $this->readExternalUser($emailAddress); 
        
        if (!$oldUser)) {
            throw new \\Exception("No user found");
        }

        $userData = [
            \'user_pass\' => $this->randomPassword(), //This will be updated after the user has been created using the hash passed
            \'user_login\' => $oldUser->login,
            \'user_nicename\' => $oldUser->niceName,
            \'user_email\' => $emailAddress,               
            \'role\' => "subscriber"                
        ];
        
        $result = wp_insert_user($userData);
        $usr = get_user_by("ID", $result);    
        if (!$usr) {
            throw new \\Exception("user not created");
        }

        global $wpdb;
              
        $wpdb->update($wpdb->users, ["user_pass" => $oldUser->hash],[\'ID\' => $usr->ID]);
        
        return true;

    } catch (\\Exception $ex) {
        return false;
    }
}

1 个回复
最合适的回答,由SO网友:StripyTiger 整理而成

我发现了发生的事情。因为我已经有了密码散列,所以(据我所知)直接更新散列的唯一方法是对users表进行更新,这就是我所做的。

问题是WP缓存了用户,因此下次尝试读取值(在本例中是哈希值)以验证用户身份时,用户已被缓存,但缓存尚未使用新哈希更新,因此验证是在旧哈希上进行的。页面刷新后,一切正常。

因此,在哈希更新之后,我现在正在清除对其进行排序的缓存。

global $wpdb;
          
$wpdb->update($wpdb->users, ["user_pass" => $oldUser->hash],[\'ID\' => $usr->ID]);
/* new line below */
wp_cache_delete($usr->ID, "users");    

相关推荐

Authentication/API Questions

我们正在尝试使用S2Member来管理我们的WP站点和我们正在启动的Flash程序的成员资格。我们希望在用户登录并保持登录状态时使用S2Member对其进行身份验证。问题:Java层需要知道哪个用户登录到Wordpress(如果有的话),以便它可以将正确的数据返回到flash层。建议的解决方案:Wordpress的cookie也应该包含在Flash到Java的请求中。Java可以使用这些cookie来查询Wordpress DB以获取用户ID。我们需要知道的是:1。是否可以从数据库或文件系统获取带有coo