php - 当我的访问应用程序使用 OAuth 1.0a 服务器凭据时,我究竟如何获得自定义 WP REST API 端点来检查授权访问?
问题描述
好的,这是我的问题。我正在构建一个 Laravel 应用程序(5.4),它对我网站的 Wordpress CMS(运行版本 4.9.8)进行 API 调用。
大多数这些 API 调用都是从我构建的自定义端点检索基本 HTML 内容等的不安全请求,这些端点存在于我也在构建的自定义 WP 插件中。这是这些自定义端点之一的示例,调用菜单(通过 slug)缓冲函数,然后将缓冲的 HTML 内容作为 JSON 对象返回。
要访问此不安全的自定义端点,示例 URL 将是
http://example.com/wp-json/custom-api/v1/items/menu/ {menu-slug-goes-here}
插件中断言这个不安全的自定义 API 端点的代码将是......
function get_menu(WP_REST_Request $request) {
ob_start();
wp_nav_menu( array('menu' => $request['slug'], 'container' => false));
$menu = ob_get_contents();
ob_end_clean();
return rest_ensure_response($menu);
}
add_action( 'rest_api_init', function () {
register_rest_route( 'custom-api/v1/items/', 'menu/(?P<slug>[a-zA-Z-]+)', array(
'methods' => 'GET',
'callback' => 'get_menu',
'args' => array(
'slug' => array(
'validate_callback' => function($slug, $request, $key) {
return is_string( $slug );
}
),
),
) );
} );
到目前为止,一切都很好。这个不安全的端点工作正常。
直到我们开始设置需要 Oauth1 身份验证的自定义 API 端点。假设 Laravel 应用程序需要通过安全的自定义 API 端点调用客户数据。
经过几天的研究,我无法弄清楚这一点,所以我想知道是否有人可以给我一些建议?
在我们开始之前,值得注意的是;
- 根据 WP API 文档,身份验证主要是通过 cookie 完成的,但是用户需要登录才能发生这种情况?或者可以使用 nonce 发出 AJAX 请求。这是文档的链接;
https://developer.wordpress.org/rest-api/using-the-rest-api/authentication/
- 我正在使用 Wordpress REST API - OAuth 1.0a 服务器(下面的链接)插件来管理 Laravel 应用程序的身份验证。这一切都完成了,Laravel 应用程序已获得授权,它有它的消费者密钥、秘密和永久令牌,并且这些已经过测试并且能够访问 WP 的安全烘焙 API 端点,例如 /wp/v2/settings
https://wordpress.org/plugins/rest-api-oauth1/
Wordpress API 声明您可以结合使用 'permission_callback' 功能和 'current_user_can' 方法来检查身份验证(这里是 WP 的官方示例)
add_action( 'rest_api_init', function () { register_rest_route( 'myplugin/v1', '/author/(?P<id>\d+)', array( 'methods' => 'GET', 'callback' => 'my_awesome_func', 'args' => array( 'id' => array( 'validate_callback' => 'is_numeric' ), ), 'permission_callback' => function () { return current_user_can( 'edit_others_posts' ); } ) ); } );
所以我的问题是……
A) 是否可以创建一个需要并在自定义端点检查 Oauth1 凭据的函数?
B)如果没有,应用程序能否找到一种方法来提供其作为用户的状态,然后从那里调用“current_user_can”?
C)或者他们的另一个解决方案是我完全想念的???
非常感谢您的帮助,感谢所有建设性和善意的建议!
解决方案
推荐阅读
- c - 如何比较两个日期和时间并以分钟为单位计算差异。我正在尝试比较用户证书
- python - 确切的地球移动距离(不是锦葵距离)Python代码
- python - 如何制作排行榜命令 discord.py?
- react-native-code-push - 我们可以只为特定设备发布 codepush 吗?
- javascript - 删除具有相同状态的重复记录并仅保留最新记录
- css - 我尝试使用横幅背景,但它不能正常工作?我已将此代码放在我的头部
- reactjs - 未找到与该模式匹配的文件:“'**/*.js'”
- python - 给定一个指示段边界的值,为张量生成段标签
- linux - 如何在 Linux 的 Monodevelop 中打开 Unity3d 类的自动完成功能?
- django - CSRF cookie 未在 chrome 中设置 Django 跨站点 iframe