One question: 发送请求的第三方是否通过用户cookie?
如果没有,那么WP将像对待任何其他客人一样对待该请求!如果是,你检查过了吗$_COOKIE
什么时候send_response()
跑步?
Update: 我想我会一劳永逸地结束下面的讨论:)
您必须维护已登录用户的数据库日志
我以为WP已经这么做了!
不,WP只是在每个请求上验证cookie(如果发送了cookie)。
我以为cookies存储在浏览器中
是的。
因此,如果同一个用户登录到我的站点,然后访问子域站点,该子域站点调用file\\u get\\u contents(),为什么没有cookie?
因为API请求来自服务器,而不是浏览器。这就像问你为什么在使用Firefox登录后没有使用Chrome登录!
我想收回我关于维护登录日志的建议,因为我相信有两种更好、更简单的解决方案;
在客户端(即使用AJAX)激发请求-因为它来自用户的浏览器,所以cookie会像您预期的那样一起发送,在服务器端将用户的cookie与您的API请求一起发送*(请参见下文)
使用客户端cookie发送远程get的示例代码:$data = array();
if ( ! empty( $_SERVER[\'HTTP_COOKIE\'] ) ) {
foreach ( explode( \'; \', $_SERVER[\'HTTP_COOKIE\'] ) as $pair )
$data[\'cookies\'][] = new WP_Http_Cookie( $pair );
}
// Wp_Http_Cookie will choke if cookie value has special characters.
add_filter( \'wp_http_cookie_value\', \'rawurlencode\' );
if ( $get = wp_remote_get( $url, $data ) ) {
// Yippee!
}
However, 2) 有一个陷阱;验证API请求所需的cookie必须发送给触发它的脚本(这里提到的子域标志着潜在的问题)。如果您将多站点与子域一起使用,这将得到解决。否则,您需要在wp-config.php
:
define( \'COOKIE_DOMAIN\', \'.example.com\' );
看到那个点前缀了吗?这表示应将cookie发送到域或其任何子域(而默认情况下,WP将其设置为仅将其应用于主域)。