从另一个网站自动登录到 WordPress

无需密码即可从网站 A自动安全登录网站 B。我们可以通过使用 WordPress 的 wp_set_auth_cookie() 函数来完成此操作。

网站 A = 请求自动登录链接的网站。
网站 B = 您希望自动登录的网站。

注意:我假设您有两个具有相同用户名或用户 ID 的同步数据库。

在您的 SQL 命令行中执行此 SQL 查询以创建一个新表“wp_autologin”

创建表数据库名称。wp_autologin (
  id INT NOT NULL AUTO_INCREMENT ,
  avatar VARCHAR ( 45 ) NULL ,
  random_key VARCHAR ( 45 ) NULL ,
  PRIMARY KEY ( id ) ) ;

第 1 步:在网站 B 中创建一个WordPress CUSTOM 页面。为避免以后出错,只需将其命名为“autologin-api”

这是我们将接收来自网站 A 的请求的地方

// 为我们的数据数组创建初始默认值
$err_succ = array (
    'key'   => 0 ,
    'status' => 'failed'
) ;

// 检查接收到的密钥是否为 '54321' 以及操作是否为 'get_login_key'
if ( isset ( $_POST ) && $_POST [ 'key' ] == '54321' && $_POST [ 'action' ] == ' get_login_key' ) {
   
    全局 $wpdb ;
   
    // 检查我们是否从 POST 接收到 user_login,如果是 - 我们对其进行清理,然后将其保存到变量
    $user_login = isset ( $_POST [ 'user_login' ] )?sanitize_text_field ( $_POST [ 'user_login' ] ) : '' ;
   
    // 从数据库中获取用户的随机密钥
    $user_random_key = $wpdb -> get_var ( $wpdb -> prepare ( "
        SELECT random_key FROM wp_autologin WHERE avatar = %s " , $user_login ) ) ;
   
    // 从数据库中统计 user_login 的数量。如果查询返回> 0,则表示它存在于数据库中。
    $check_user_login = $wpdb -> get_var ( $wpdb -> prepare ( "
        SELECT COUNT(user_login) FROM wp_users WHERE user_login = ' %s '" , $user_login ) ) ;
   
    // 检查接收到的 user_login 是否存在于 wp_users 表中
    if ( $check_user_login > 0 ) {    
       
        // 检查 $user_random_key 变量是否返回了 random_key。如果不是,我们生成另一个随机密钥。
        如果( empty ( $user_random_key ) ) {
       
            // 使用 md5 随机字符串生成密钥
            $hash_key = md5 ( $user_login + rand ( 5 , 15 ) ) ;
                   
            // 将头像(user_login) 和密钥保存到数据库
            $wpdb -> insert (
                'wp_autologin' ,
                array (
                    'avatar' => $user_login ,
                    'random_key' => $hash_key
                )
            ) ;
           
        } 其他 {
            // 如果 $user_random_key 变量返回一个 random_key,我们将它返回给请求的客户端。
            $hash_key = $user_random_key ;
        }
       
        // 返回 hash_key 并将状态设置为成功
        $err_succ [ 'key' ] = $hash_key ;
        $err_succ [ '状态' ] = '成功' ;
           
    } else {
       
        // 如果接收到的 user_login 在数据库中不存在,我们将失败状态返回给请求的客户端
        $err_succ [ 'status' ] = 'failed' ;
    }
}

// 将数组设置为变量
$result = $err_succ ;

// JSON 编码结果然后将其发送回请求客户端
echo json_encode ( $result ) ;

第 2 步:在网站 B 中创建另一个WordPress CUSTOM 页面,将其命名为“autologin”

global $wpdb;
// 检查用户是否已经登录,如果为真,则重定向到帐户 if
( ! is_user_logged_in ( ) ) { //

    检查密钥是否已设置且不为空
    if ( isset ( $_GET [ 'key' ] ) && ! empty ( $_GET [ 'key' ] ) ) {

        // 清理收到的密钥以防止 SQL 注入
        $received_key = sanitize_text_field ( $_GET [ 'key' ] );
       
        // 使用接收到的密钥从数据库中查找用户名
        $get_username = $wpdb -> get_var ( $wpdb -> prepare ( "SELECT avatar FROM wp_autologin WHERE random_key = %s " , $received_key ) ) ;
       
        // 检查查询是否返回结果,如果为假则抛出错误
        if ( ! empty ( $get_username ) ) {
       
            // 从用户名中获取用户信息,然后将其保存到变量
            $user = get_user_by ( 'login' , $get_username ) ;
           
            // 获取用户 id 然后将登录 cookie 设置到浏览器
            wp_set_auth_cookie ( $user -> ID ) ;
           
            // 为确保登录 cookie 已设置,我们再次检查。
            foreach ( $_COOKIE as $name => $value ) {
               
                // 查找前缀以 "wordpress_logged_in_" 开头的 cookie
                if ( substr ( $name , 0 , strlen ( 'wordpress_logged_in_' ) ) == 'wordpress_logged_in_' ) {
               
                    // 如果登录 cookie 已设置,则重定向到帐户页面。
                    wp_redirect ( home_url ( '/account/' ) ) ;
                   
                } else {
               
                    // 如果没有设置,我们循环 URL 直到登录 cookie 被设置到浏览器
                    wp_redirect ( home_url ( '/autologin/?key=' . $received_key ) ) ;
                       
                }
            }
           
        } else {
            echo '无效的认证密钥' ;
        }
    } else {
        wp_redirect( home_url() );
    }

} else {
    wp_redirect( home_url('/account/') );
    exit;
}

第 3 步:向网站 B 发送请求。

在本教程中,我们将使用 cURL 向网站 B 发送请求,您可以随意使用其他技术来发送 HTTP 请求。

// 定义我们将发送随机密钥请求的 URL
    $api_url = "http://YOUR_WEBSITE_URL.com/autologin-api/" ;
   
    // 如果您在网站 A 上使用 WordPress,您可以执行以下操作来获取当前登录的用户:
    global $current_user ;
    $user_login = $current_user -> user_login ;
   
    // 设置参数
    $params = array (
        'action'            => 'get_login_key' , // 网站 B 上的动作名称
        'key'               => '54321' ,
        'user_login'       => $user_login // 传递A网站当前登录用户的user_login
    ) ;
   
    // 使用 cURL 发送数据
    $ch = curl_init ( $api_url ) ;
    curl_setopt($ch , CURLOPT_SSL_VERIFYPEER , 假);
    curl_setopt ( $ch , CURLOPT_POST , 1 ) ;
    curl_setopt ( $ch , CURLOPT_POSTFIELDS , http_build_query ( $params ) ) ;
    curl_setopt ( $ch , CURLOPT_FOLLOWLOCATION , 1 ) ;
    curl_setopt ( $ch , CURLOPT_HEADER , 0 ) ;
    curl_setopt ( $ch , CURLOPT_RETURNTRANSFER , 1 ) ;
    $gbi_response = curl_exec ( $ch ) ;
    curl_close ( $ch ) ;
   
    // 解析响应
    parse_str ( $gbi_response ) ;
   
    // 将网站 B 的响应转换为数组
    $data = json_decode ( $gbi_response , true ) ;
   
    // 将接收到的密钥设置为变量
    $key = $data [ 'key' ] ;

从这里,您现在可以生成将自动登录到网站 B 的链接。

echo '<a href = "http://YOUR_WEBSITE_URL.com/autologin/?' . $key . '">我的网站 B 帐户</a>' ;

©️李联华的博客网 当前IP地址:44.200.27.215,欢迎您的访问!

温馨提示 : 非特殊注明,否则均为李联华的博客原创文章,本站文章未经授权禁止任何形式转载
文章链接:https://www.ooize.com/auto-login-to-wordpress-from-another-website.html

订阅文章

在下面输入您的电子邮件地址以订阅我们的文章

留下评论

Loading...