WordPress REST API手册(三):常见问题

此页面提供了使用 API 时可能出现的一些常见问题和问题的解决方案。如果您的问题未在此处解释,则可能已在WordPress 支持论坛中得到解答。

我可以禁用 REST API 吗?

您不应该禁用 REST API;这样做会破坏依赖 API 处于活动状态的 WordPress 管理功能。但是,您可以使用过滤器来要求对 API 使用者进行身份验证,从而有效地防止匿名外部访问。请参阅下面的详细信息。

顶部↑

要求对所有请求进行身份验证

您可以通过向过滤器添加is_user_logged_in检查来要求对所有 REST API 请求进行身份验证。rest_authentication_errors

注意:传入的回调参数可以是null、 aWP_Error或布尔值。参数的类型表示认证的状态:

  • null:尚未执行任何身份验证检查,钩子回调可能会应用自定义身份验证逻辑。
  • boolean:表示执行了先前的身份验证方法检查。布尔值true表示请求认证成功,布尔值false表示认证失败。
  • WP_Error: 遇到了某种错误。
add_filter( 'rest_authentication_errors', function( $result ) {
    // If a previous authentication check was applied,
    // pass that result along without modification.
    if ( true === $result || is_wp_error( $result ) ) {
        return $result;
    }
 
    // No authentication has been performed yet.
    // Return an error if user is not logged in.
    if ( ! is_user_logged_in() ) {
        return new WP_Error(
            'rest_not_logged_in',
            __( 'You are not currently logged in.' ),
            array( 'status' => 401 )
        );
    }
 
    // Our custom authentication check should have no effect
    // on logged-in requests
    return $result;
});

我可以在插件中从 PHP 发出 API 请求吗?

是的你可以!使用rest_do_request在其他 WordPress 代码内部发出 API 请求:

$request = new WP_REST_Request( 'GET', '/wp/v2/posts' );
// Set one or more request query parameters
$request->set_param( 'per_page', 20 );
$response = rest_do_request( $request );

如何在内部请求中使用 _embed 参数?

在请求对象上设置_embed参数将不起作用。

$request = new WP_REST_Request( 'GET', '/wp/v2/posts' );
$request->set_param( '_embed', 1 );
$response = rest_do_request( $request );

相反,手动调用该WP_REST_Server::response_to_data函数。

$request = new WP_REST_Request( 'GET', '/wp/v2/posts' );
$response = rest_do_request( $request );
$data = rest_get_server()->response_to_data( $response, true );
var_dump( $data['_embedded'] );

?filter=查询参数发生了什么?

当 REST API 合并到 WordPress 核心时,?filter查询参数被删除以防止将来出现兼容性和维护问题。在 REST API 项目的起源中,使用查询参数将任意WP_Query参数传递给 API的能力?filter是必要的,但大多数 API 响应过滤功能已被更强大的查询参数(如?categories=?slug=?per_page=.

应尽可能使用第一方查询参数。但是,如果需要, rest-filter?filter插件恢复了在 API 请求中传递任意值的能力。

顶部↑

查询参数不起作用

如果您发现查询参数如?page=2or?_embed没有任何效果,您的服务器可能没有正确配置以检测它们。如果您使用 Nginx 为您的网站提供服务,请try_files在您的网站配置中查找一行。如果它看起来像这样:

try_files $uri $uri/ /index.php$args;

将其更改为:

	
try_files $uri $uri/ /index.php$is_args$args;

添加$is_args(如果找到查询参数,将打印 ? 字符)将允许 WordPress 正确接收和解释查询参数。

为什么身份验证不起作用?

如果您发现您正在发送身份验证标头但请求未被接受,并且您使用的是 CGI 环境,则您的网络服务器可能正在剥离标头。请尝试在下面添加适当的配置来解决此问题。

阿帕奇

将以下内容添加到配置文件或 .htaccess:

<IfModule mod_setenvif>
  SetEnvIf Authorization "(.*)" HTTP_AUTHORIZATION=$1
</IfModule>

Nginx

将以下内容添加到您的服务器配置 fastcgi 部分:

fastcgi_pass_header Authorization;

为什么 REST API 不验证传入的 Origin 标头?这会使我的网站遭受 CSRF 攻击吗?

跨域资源共享 (CORS) 是一种机制,它允许网站控制允许哪些来源(源自外部站点)访问您的站点的数据。CORS 可防止称为跨站点请求伪造或 CSRF 的特定类型的攻击。但是,WordPress 有一个使用nonces的现有 CSRF 保护机制。收紧 CORS 限制会阻止某些身份验证方法,因此 WordPress REST API 使用随机数来保护 CSRF 而不是 CORS。

由于 WordPress REST API 不验证传入请求的 Origin 标头,因此可以从任何站点访问公共 REST API 端点。

这是一个有意的设计决定,但如果您希望防止您的网站被未知来源访问,您可以从过滤器挂钩中取消挂钩默认rest_send_cors_headers功能,然后将您自己的功能挂钩到同一个过滤器以指定更严格的 CORS 标头。rest_pre_serve_request


《WordPress REST API手册》完整目录:

THE END
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片