如何构建一个插件来支持从外部服务器到rest API的经过身份验证的POST请求?

时间:2020-04-28 作者:Lucas Bustamante

API的主要用途之一是允许集成不同的服务/系统。

让我们考虑一下WordPress REST API可以同时具有公共端点和受保护端点,其中公共端点不需要任何形式的身份验证,而受保护端点则需要。

公共端点示例:GET https://main.loc/wp-json/wp/v2/postsPOST https://main.loc/wp-json/wp/v2/posts

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_cookiewp_validate_logged_in_cookie 挂钩动作。

这些操作检查请求是否包含有效的身份验证cookie,该cookie通过函数进行验证,但由于以下两个原因,很难从外部系统生成它们:

cookie名称本身需要了解COOKIEHASH, 对于大多数网站来说,这将是网站URL的简单md5,但有些网站可以通过将常量定义为另一个值来覆盖此cookie哈希wordpress_logged_in_COOKIE_HASH=username|expiration|token|hmactoken 在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 keyConsumer secret 可用于发送经过身份验证的请求:

Authenticated request:authenticated request

Same request, without authentication:same request, without authentication

毕竟,我的理解是,WordPress 5.4 REST API因此没有提供一种从外部服务器向受保护端点发送经过身份验证的请求的现成方法,您可以使用JWT第三方路由,或者构建一个健壮的解决方案来提供基本的身份验证或OAuth身份验证方法,就像WooCommerce所做的那样。是这样吗?

1 个回复
SO网友:Lucas Bustamante

回答我自己的问题

对于插件开发人员,指令是使用current_user_can() 在REST端点的代码中,就像Core一样。

WordPress 5.4还不支持从WordPress外部向REST API发出的经过身份验证的请求。但是你的客户可以使用插件,比如Basic Auth, OAuth2JWT 添加该功能。

Wordpress中的REST团队正在努力将内置的身份验证方法添加到核心OAuth2中。现在是2020年5月1日。我明目张胆,可能是错误的猜测,这可能会在12个月左右达到核心。

2021更新,5.6版本的WordPress core中添加了REST API认证和应用程序密码!

https://wordpress.org/support/wordpress-version/version-5-6/#rest-api-authentication-with-application-passwords

相关推荐

允许登录的WordPress用户通过OAuth访问第三方Laravel API

我有一个独特的情况,如果可能的话,我希望得到一些帮助:我的公司管理着很多WordPress网站。每个站点都有自己独特的用户集(所有站点中的用户都是相同的,但有些用户只访问X,其他用户访问Y,其他用户同时访问X和Y,等等)。我们使用一个定制的SSO插件来管理所有这些,包括权限等,这些都可以完美地工作。我在Laravel建立了一个应用程序,它既有公共路线也有私人路线。我使用Laravel Passport/OAuth访问私人路线。前面的一切都很完美。然而,我现在面临的情况是,我需要让WordPress用户访问