如何通过 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 中受保护数据的远程访问进行身份验证?的主要内容,如果未能解决你的问题,请参考以下文章

WordPress REST API 未检索所有数据

javascript WordPress查询多种帖子类型(REST API),对REST API的请求 - 查询多个帖子类型并按ACF字段对数据排序

使 WordPress 用户元数据可用于 Rest-API

React Native - 如何使用 JWT 令牌从 WordPress REST API 获取私人帖子

Wordpress Rest API:返回 100 多个结果

将 WordPress Rest API 请求限制到我的域