如何通过Wordpress REST API进行身份验证以对LearnDash中的受保护数据进行远程访问?

时间:2020-11-01 19:09:11

标签: wordpress api rest mobile

我正在开发一个移动应用程序(在Flutter中),该应用程序需要从Wordpress LearnDash LMS环境访问用户的课程数据。可通过https://<site>/wp-json/ldlms/v1/路径通过标准REST API访问Wordpress网站。

但是每当我尝试访问例如<...>/ldlms/v1/sfwd-courses/<id>/steps,结果是401(未经授权)状态。

我从Wordpress文档中了解到它使用cookie身份验证。但是将wordpress_logged_in_<hash> cookie添加到请求标头似乎没有什么不同。

在哪里可以找到访问此信息所需的缺少身份验证的详细信息?

1 个答案:

答案 0 :(得分:0)

我刚刚构建了REST API;因此我可能会有所帮助。下面的示例将:

  1. 注册自定义rest api端点
  2. 在首次加载时本地化服务器端变量(端点,用户对象等)
  3. 将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);
            }
        }
    };