验证

Cookie 认证

Cookie 身份验证是 WordPress 附带的标准身份验证方法。当您登录到仪表板时,这会为您正确设置 cookie,因此插件和主题开发人员只需要有一个登录用户即可。

但是,REST API 包含一种称为nonces的技术来避免CSRF问题。这可以防止其他站点在您没有明确意图的情况下强迫您执行操作。这需要对 API 进行稍微特殊的处理。

对于使用内置 Javascript API 的开发人员,这是自动为您处理的。这是将 API 用于插件和主题的推荐方式。自定义数据模型可以扩展wp.api.models.Base以确保为任何自定义请求正确发送。

对于发出手动 Ajax 请求的开发人员,随机数将需要与每个请求一起传递。API 使用随机数并将操作设置为wp_rest_wpnonce然后可以通过数据参数(POST 数据或在 GET 请求的查询中)或通过标头将这些传递给 API X-WP-Nonce。如果没有提供 nonce,API 会将当前用户设置为 0,将请求转换为未经身份验证的请求,即使您已登录 WordPress。

注意:直到最近,大多数软件对请求的支持都参差不齐DELETE。例如,PHP 不会将DELETE请求的请求主体转换为超级全局。因此,将随机数作为标头提供是最可靠的方法。

请务必记住,此身份验证方法依赖于 WordPress cookie。因此,此方法仅适用于在 WordPress 内部使用 REST API 并且当前用户已登录的情况。此外,当前用户必须具有执行正在执行的操作的适当能力。

例如,这是内置 Javascript 客户端创建随机数的方式:

<?php
wp_localize_script( 'wp-api', 'wpApiSettings', array(
    'root' => esc_url_raw( rest_url() ),
    'nonce' => wp_create_nonce( 'wp_rest' )
) );

然后在基本模型中使用:

options.beforeSend = function(xhr) {
    xhr.setRequestHeader('X-WP-Nonce', wpApiSettings.nonce);
    if (beforeSend) {
        return beforeSend.apply(this, arguments);
    }
};

下面是使用 jQuery AJAX 编辑帖子标题的示例:

$.ajax( {
    url: wpApiSettings.root + 'wp/v2/posts/1',
    method: 'POST',
    beforeSend: function ( xhr ) {
        xhr.setRequestHeader( 'X-WP-Nonce', wpApiSettings.nonce );
    },
    data:{
        'title' : 'Hello Moon'
    }
} ).done( function ( response ) {
    console.log( response );
} );

请注意,您无需验证随机数在您的自定义端点内是否有效。这是自动为您完成的rest_cookie_check_errors()

使用应用程序密码进行基本身份验证

从 5.6 开始,WordPress 附带了Application Passwords,它可以从 Edit User 页面生成(wp-admin -> Users -> Edit User)。

可以使用Basic Auth / RFC 7617将凭据传递给通过 https:// 服务的 REST API 请求——这里是有关如何将其与 cURL 一起使用的文档。

对于一个简单的命令行脚本示例,只需将其中的 USERNAME、PASSWORD 和 HOSTNAME 替换为它们各自的值:

curl --user "USERNAME:PASSWORD" https://HOSTNAME/wp-json/wp/v2/users?context=edit

认证插件

可以添加插件以支持将从远程应用程序运行的替代身份验证模式。一些示例插件是OAuth 1.0a Server和JSON Web Tokens。

笔记:

还有一个基本身份验证插件。

请注意,此插件需要在每次请求时发送您的用户名和密码,并且只能用于开发和测试,即不能用于生产环境。首选使用应用程序密码(见上文)。