WordPress REST API,缓存中的过期随机数导致403被禁用

时间:2019-06-26 作者:elMarquis

我的wordpress站点位于Akamai之后,Akamai是一种类似于Cloudflare的缓存服务。

我进行以下API调用:

GET /wp-json/mytheme/v1/get-posts?post_type=videos
这是使用来自“@wordpress/api fetch”的apiFetch完成的;

它会自动将其包含在请求标头中

X-WP-Nonce: 12323423
这可以正常工作,直到24小时后,nonce过期。缓存仍然继续使用过期的Nonce,导致403被禁止和页面被破坏。

如果我在没有Nonce头的情况下发出相同的请求,那么它就可以正常工作。

Wordpress中有没有办法禁用或删除仅用于GET请求的Nonce?

或者甚至通过拦截请求来删除X-WP-Nonce头?

这是我从wordpress前端发出请求的代码。

apiFetch({
     path: \'/wp-json/mytheme/v1/get-posts?post_type=videos\',
     parse: false,
});

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

基于身份验证文档here - 每个请求都需要传递一个nonce密钥。

因此,如果在前端缓存的nonce密钥超过了其使用寿命,则需要在身份验证步骤之前钩住API请求,并用有效的nonce密钥替换缓存的nonce密钥。

WordPress提供rest_send_nocache_headers 供我们连接的过滤器(See here). 这允许我们在身份验证之前执行操作。

$send_no_cache_headers = apply_filters(\'rest_send_nocache_headers\', is_user_logged_in());
if (!$send_no_cache_headers && !is_admin() && $_SERVER[\'REQUEST_METHOD\'] == \'GET\') {
    $nonce = wp_create_nonce(\'wp_rest\');
    $_SERVER[\'HTTP_X_WP_NONCE\'] = $nonce;
}
在上面的示例中,我们通过is_user_logged_in() 函数作为参数。这将返回true或false。

然后在我们的查询中,如果用户未登录,则他们不在管理员中,这是GET 请求我们继续用有效的nonce密钥切换无效的nonce密钥。

SO网友:Andy Keith

为了补充已被接受的答案,我找到了一个类似的解决方案,但却与rest_authentication_errors 之前rest_cookie_check_errors 跑步

由于根本问题是nonce expiration,因此当用户登录时(即没有发送缓存头时)以及注销时,可能会出现此问题。我还进行了一些检查,以确保我们只处理REST请求——我检查了“REST\\U路由”查询变量,但可能有更好的方法来实现这一点。

add_filter( \'rest_authentication_errors\', function( $errors ) {
        // Bail if rest_route isn\'t defined (shouldn\'t happen!)
        if ( empty( $GLOBALS[\'wp\']->query_vars[\'rest_route\'] ) ) {
            return $errors;
        }

        $route = ltrim( $GLOBALS[\'wp\']->query_vars[\'rest_route\'], \'/\' );

        // Ensure we\'re dealing with our REST requst.
        if ( 0 !== strpos( $route, \'my-awesome-namespace/v1\' ) ) {
            return $errors;
        }

        if ( ! empty( $_SERVER[\'HTTP_X_WP_NONCE\'] ) ) {
            $nonce = $_SERVER[\'HTTP_X_WP_NONCE\'];

            if ( ! wp_verify_nonce( $nonce, \'wp_rest\' ) ) {
                // Nonce check failed, so create a new one.
                $_SERVER[\'HTTP_X_WP_NONCE\'] = wp_create_nonce( \'wp_rest\' );
            }
        }

        return $errors;
    }, 10 );

相关推荐

Which cache is kicking

我一直在为一个从另一个开发者那里继承下来的网站而挣扎。我的主要问题是,我在模板的css文件中所做的更改并没有立即得到响应,这表明某种缓存正在发挥作用。我检查的是。这个。任何缓存指令的htaccess文件</任何可能被激活的缓存WordPress插件</主机实现的任何缓存功能</Cloudflare或任何其他CDN</我尝试了不同的浏览器和计算机,所以缓存是服务器端的您可以想象,上面的任何一项都没有启用,但我对css的更改需要几个小时才能看到。我在任何方面都不是WordPress专家