通过子域

时间:2017-05-16 18:07:13

标签: php wordpress api authentication cookies

我想在单独的Laravel安装中访问当前登录的Wordpress用户。

Wordpress作为 website.com 运行,并且我使用Laravel应用程序(在另一台服务器上但是同一个域)上有 tool.website.com 的子域)。

我使用Native Wordpress API并创建了身份验证路径。

问题:

当我直接访问 / authenticate 路由时,将返回用户ID并正常工作。但是当我通过tool.website.com访问路线时, false 会被返回..

我工作过的事情

我已经创建了一个API请求,它在API调用中返回用户ID:

add_action( 'rest_api_init', function () {
  register_rest_route( '/authenticate', array(
    'methods' => 'GET',
    'callback' => 'authenticate',
  ) );
} );

该功能如下所示:

$user_id = wp_validate_auth_cookie( $_COOKIE[LOGGED_IN_COOKIE], 'logged_in' );

WP cookie在子/主域上都可用。我可以看到他们是完全相同的。

define('COOKIE_DOMAIN', '.website.dev');

我尝试过的事情:

  • 使用wp_get_current_user()来检索用户,这似乎需要一个随机数。我用许多不同的方法用nonce方法实验了几个小时,但是我无法使用它(假或返回0)。我知道这是因为限制使用Wordpress外部的随机数。
  • 使用默认的本机API方法来获取用户,也需要nonce。
  • 阅读https://developer.wordpress.org/rest-api/手册,git repository&几篇文章/评论在线。
  • 考虑OAuth方法,但我不希望用户再次登录,因为他们在到达工具时已经登录。
  • 发送帖子之类的东西没有问题,因此API连接不是问题。

我想知道我的方法是否朝着正确的方向发展。希望有人可以给我一些指导。

1 个答案:

答案 0 :(得分:0)

我找到了以下解决方法:

- tool.website.com  将Cookie从tool.website.com发送到API作为发布数据。

    $cookie_array = $_COOKIE; 

    // use key 'http' even if you send the request to https://...
    $options = array(
        'http' => array(
            'header'  => "Content-type: application/x-www-form-urlencoded\r\n",
            'method'  => 'POST',
            'content' => http_build_query($cookie_array)
        )
    );
    $context  = stream_context_create($options);
    $data = file_get_contents(self::BASE_URL . "authenticate", false, $context);

- website.com 从Post数据中检索cookie,并使用Wordpress中的标准LOGGED_IN_COOKIE常量来选择正确的(这可以重构为立即发送正确的cookie)。

  // We retrieve the cookie (which is sadly not available through the API call alone)
  $the_cookie = $request->get_body_params();

  // As the cookie lives at domain level, we can use the same Cookie key in the WP API and other subdomains of this domain
  // The cookie key remains the same
  $user_id = wp_validate_auth_cookie( $the_cookie[LOGGED_IN_COOKIE], 'logged_in' ); 

这个解决方案似乎很稳定;希望它会帮助某人。如果还有其他解决方案,请在本主题中添加;因为我确信必须有不同的方法来实现这一点。