API的主要用途之一是允许集成不同的服务/系统。
让我们考虑一下WordPress REST API可以同时具有公共端点和受保护端点,其中公共端点不需要任何形式的身份验证,而受保护端点则需要。
公共端点示例:GET https://main.loc/wp-json/wp/v2/posts
受保护端点的示例:POST https://main.loc/wp-json/wp/v2/posts
在内部,WordPress像这样保护POST端点:
WordPress 5.4:wp包括/rest api/端点/类wp rest posts控制器。菲律宾比索:550
if ( ! current_user_can( $post_type->cap->create_posts ) ) {
return new WP_Error(
\'rest_cannot_create\',
__( \'Sorry, you are not allowed to create posts as this user.\' ),
array( \'status\' => rest_authorization_required_code() )
);
}
这最终意味着它是一种基于cookie的认证方法,通过链
current_user_can()
-&燃气轮机;
_wp_get_current_user
-&燃气轮机;
determine_current_user
过滤器->;
wp_validate_auth_cookie
和
wp_validate_logged_in_cookie
挂钩动作。
这些操作检查请求是否包含有效的身份验证cookie,该cookie通过函数进行验证,但由于以下两个原因,很难从外部系统生成它们:
cookie名称本身需要了解COOKIEHASH
, 对于大多数网站来说,这将是网站URL的简单md5,但有些网站可以通过将常量定义为另一个值来覆盖此cookie哈希然而,cookie的价值才是真正的挑战。它需要以下格式的值:wordpress_logged_in_COOKIE_HASH=username|expiration|token|hmac
然而,恐怕没有办法token
在WordPress本身的上下文之外,所以我不可能从第三方发送基于cookie的认证请求,只能从WordPress本身内部发送。
我知道有这样的计划https://github.com/WP-API/jwt-auth 提供一种基于JWT的身份验证方法。然而,作为插件开发人员,我希望避免依赖另一个第三方插件来为我的受保护端点提供身份验证。
我见过的唯一一个我想实现的地方就是WooCommerce。它把自己挂在determine_current_user
要在基于cookie的默认验证逻辑之上添加自己的验证逻辑,请执行以下操作:https://github.com/woocommerce/woocommerce/blob/master/includes/class-wc-rest-authentication.php#L69-L90
这增加了Basic-Auth 使用HTTPS对网站进行身份验证,以及OAuth 对于HTTP。
对于基本身份验证,需要转到仪表板WooCommerce->;设置->;REST API->;创建一个新密钥,并将该密钥分配给用户。那会给你一个Consumer key
和Consumer secret
可用于发送经过身份验证的请求:
Authenticated request:
Same request, without authentication:
毕竟,我的理解是,WordPress 5.4 REST API因此没有提供一种从外部服务器向受保护端点发送经过身份验证的请求的现成方法,您可以使用JWT第三方路由,或者构建一个健壮的解决方案来提供基本的身份验证或OAuth身份验证方法,就像WooCommerce所做的那样。是这样吗?