如何通过 Wordpress REST API 对 LearnDash 中受保护数据的远程访问进行身份验证?
Posted
技术标签:
【中文标题】如何通过 Wordpress REST API 对 LearnDash 中受保护数据的远程访问进行身份验证?【英文标题】:How to authenticate for remote access to protected data in LearnDash via the Wordpress REST API? 【发布时间】:2020-11-01 19:09:11 【问题描述】:我正在开发一个移动应用程序(在 Flutter 中),它需要从 Wordpress LearnDash LMS 环境访问用户的课程数据。 Wordpress 站点可通过标准 REST API 通过 https://<site>/wp-json/ldlms/v1/
路径访问。
但是每当我尝试访问时,例如<...>/ldlms/v1/sfwd-courses/<id>/steps
,结果是401(未授权)状态。
从 Wordpress 文档中我了解到它使用 cookie 身份验证。但是在请求头中添加wordpress_logged_in_<hash>
cookie 似乎并没有什么不同。
在哪里可以找到访问此信息所需的缺少的身份验证详细信息?
【问题讨论】:
【参考方案1】:我刚刚构建了我的 REST API;所以我可能会有所帮助。下面的示例将:
-
注册一个自定义的 rest api 端点
在首次加载时本地化服务器端变量(端点、用户对象等)
将 NONCE 附加到所有休息请求,避免散列 BS
Rest API Authentication Reference
functions.php
add_action('rest_api_init', 'register_custom_fields');
function register_custom_fields()
register_rest_route(
'app', '/login/',
[ 'methods' => 'POST', 'callback' => 'asset_login' ]
);
function asset_login()
$user = wp_signon($_POST);
if (is_wp_error($user))
return [ 'result' => 'fail', 'error' => $user->get_error_message() ];
else
return [ 'result' => 'success', 'user' => [ 'ID' => $user->data->ID, 'name' => $user->data->display_name ] ];
add_action('init','stage_script');
function stage_script()
wp_enqueue_script('asset-library', trailingslashit(get_stylesheet_directory_uri()) . 'js/asset-library.js', ['jquery']);
$assetUser = null;
if (is_user_logged_in())
$user = wp_get_current_user();
$assetUser = [
'ID' => $user->data->ID,
'name' => $user->data->display_name,
'nickname' => $user->data->user_nicename,
'email' => $user->data->user_email,
'allcaps' => $user->allcaps
];
wp_localize_script( 'your-app', 'App', [
'user' => $assetUser,
'api_endpoint' => esc_url_raw( rest_url() ),
'api_version' => 'wp/v2/',
'nonce' => wp_create_nonce( 'wp_rest' )
]);
script.js
// The Login Controller
let AppUser =
loggedIn: false,
login: function(data)
$.ajax(
url: App.api_endpoint + 'your-app/login',
method: 'POST',
beforeSend: function ( xhr )
xhr.setRequestHeader( 'X-WP-Nonce', App.nonce );
,
data: data,
success: function(response)
/* ... parse response ... */
,
error: function(response)
/* ... parse response ... */
);
;
// The API Controller
let QueryController =
Objects: [],
getObjects: async function()
let q = ;
/* ... build query stuff extracted */
try
const response = await $.ajax(
url: App.api_endpoint + App.api_version + 'post_object',
method: 'GET',
beforeSend: function ( xhr )
xhr.setRequestHeader( 'X-WP-Nonce', App.nonce );
,
data: q
);
this.Objects = response;
return response;
catch(e)
console.log('Error: ', e);
;
【讨论】:
我很困惑为什么你建议创建一个新的 API 实现,而 LearnDash 已经公开了一个完整的 REST API。我不能通过在我的请求中提供适当的参数来访问现有 API 的受保护部分吗? 当然可以。 wp_signon() 方法负责所有这些。然后,nonce 只是添加到所有调用的本机 API(包括 LearnDash 的 API)。以上是关于如何通过 Wordpress REST API 对 LearnDash 中受保护数据的远程访问进行身份验证?的主要内容,如果未能解决你的问题,请参考以下文章
javascript WordPress查询多种帖子类型(REST API),对REST API的请求 - 查询多个帖子类型并按ACF字段对数据排序
React Native - 如何使用 JWT 令牌从 WordPress REST API 获取私人帖子