通过第三方系统对用户进行WordPress身份验证,两者使用相同的域

时间:2019-02-09 作者:devasia2112

我正在尝试将系统数据库中的用户身份验证到wordpress数据库中。这两个数据库都有用户记录,因为我的注册表https://domain.tld/office/register 记录两个数据库中的用户。我正在使用woocommerce api来实现这一点,但这个api没有提到如何让用户登录。

我有两个系统,都使用相同的域,只是路径不同。woocommerce的Wordpress(均为最新版本):https://domain.tld/store/我的系统:https://domain.tld/office/

我的登录表单如下:https://domain.tld/office/login (在我的情况下,使用WP登录表单不是一个选项)

这是我在登录过程中尝试过的,但没有成功

require \'/var/www/store/wp-includes/user.php\';
$credentials = array();
$credentials[\'user_login\'] = $_POST[\'username\'];
$credentials[\'user_password\'] = $_POST[\'password\'];
$credentials[\'remember\'] = true;
$autologin_user = wp_signon( $credentials, is_ssl() );
以及

$url_wp = \'https://domain.tld/store/\';
//$postdata = "log=" . $username . "&pwd=" . $password . "&wp-submit=Log%20In&redirect_to=" . $url_wp . "wp-admin/&testcookie=1";
$postdata = "log=" . $username . "&pwd=" . $password . "&wp-submit=Log%20In&redirect_to=" . $url_wp;
$ch = curl_init();
curl_setopt ($ch, CURLOPT_URL, $url_wp . "wp-login.php");
curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt ($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36");
curl_setopt ($ch, CURLOPT_TIMEOUT, 60);
curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 0);
curl_setopt ($ch, CURLOPT_REFERER, $url_wp . "wp-login.php");
curl_setopt ($ch, CURLOPT_POSTFIELDS, $postdata);
curl_setopt ($ch, CURLOPT_POST, 1);
$result = curl_exec ($ch);
curl_close($ch);
我还使用了插件“jwt authentication for wp rest api”,下面是获取令牌的代码(正如预期的那样工作),但同样不知道在何处使用此cookie发送请求。

$curl = curl_init();
curl_setopt_array($curl, array(
  CURLOPT_URL => "https://domain.tld/store/wp-json/jwt-auth/v1/token?username=ambro&password=123456789012345",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => "",
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 30,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => "POST",
  CURLOPT_POSTFIELDS => "",
));
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);

// get the token and other data
$wp_api_response = json_decode($response, true);
// $wp_api_response[\'token\'];
// $wp_api_response[\'user_email\'];
// $wp_api_response[\'user_nicename\'];
// $wp_api_response[\'user_display_name\'];

// with the token now we need to send a request to login
// "Authorization: Bearer ".$wp_api_response[\'token\']
// "Authorization: Bearer " . $wp_api_response[\'user_display_name\'].$wp_api_response[\'token\']

// store the token in a cookie
setcookie(
    \'office_wp_auth\',
    $wp_api_response[\'token\'], // cookie value
    time() + (86400 * 30), // 30 days
    \'/\', // the cookie will be available within the entire domain.
    \'\',
    TRUE, // Only send cookie over HTTPS, never unencrypted HTTP
    TRUE  // Don\'t expose the cookie to JavaScript
);
这背后的基本思想是,我的用户需要一家商店来购买物品,而当前的“商店”并不是一个完整的电子商务应用程序。我不是在研究插件开发或诸如此类的事情,只是需要我的用户在通过办公室登录时登录woocommerce商店。

我不知道如何完成这项任务,这似乎是一项非常简单的任务,但我看不到全局。

有什么想法吗?

当做

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

我找到了一个方法。我在下面创建了一个新文件夹https://domain.tld/store/ 并创建了2个新文件(/store/integra/wp-login.php/store/integra/wp-auth.php).

wp-login.php

require_once("wp-auth.php");
auth();

wp-auth.php

startit();

function auth()
{
   // decode query string
   $u = base64_decode($_GET[\'u\']);
   $p = base64_decode($_GET[\'p\']);
   $r = base64_decode($_GET[\'r\']);

   $username = htmlspecialchars($u);
   $password = htmlspecialchars($p);

   $user = get_user_by(\'login\', $username);

   if (!wp_check_password($password, $user->data->user_pass, $user->ID)):
      return false;
   endif;

   wp_set_current_user($user->ID, $username);

   if($r == "1")
      wp_set_auth_cookie($user->ID, true);
   else
      wp_set_auth_cookie($user->ID);

   if(isset($_SESSION["return_to"])):
      $url = $_SESSION["return_to"];
      unset($_SESSION["return_to"]);
      header("location: $url");
   else:
      header("location: /Office/home");
   endif;
}

function login()
{
   if(!is_user_logged_in()):

      $_SESSION["return_to"] = $_SERVER[\'REQUEST_URI\'];
      header("location: /integra/wp-login.php");

   endif;
}

function startit()
{
   if(!session_id())
      session_start();

   define(\'WP_USE_THEMES\', false);
   require_once("../wp-load.php");
}
如果需要更多的页面,只需遵循相同的想法,包括wp auth。php和wordpress函数可用。

就这些,行得通。

相关推荐