Cookie 认证
Cookie 认证是 WordPress 内置的标准认证方法。当您登录到仪表板时,它会自动为您正确设置 Cookie,因此插件和主题开发者只需确保用户已登录即可。
然而,REST API 包含一种称为 nonce 的技术,以避免 CSRF(跨站请求伪造) 问题。这可以防止其他站点强迫您在未明确意图的情况下执行操作。这需要对 API 进行稍微特殊的处理。
对于使用内置 JavaScript API 的开发者,此功能会自动为您处理。这是插件和主题使用 API 的推荐方式。自定义数据模型可以通过扩展 wp.api.models.Base 来确保任何自定义请求都能正确发送 nonce。
对于手动发起 Ajax 请求的开发者,每次请求都需要传递 nonce。API 使用的 nonce 动作设置为 wp_rest。这些 nonce 可以通过 _wpnonce 数据参数(POST 数据或 GET 请求的查询字符串)或通过 X-WP-Nonce 头部传递给 API。如果未提供 nonce,API 会将当前用户设置为 0,使请求变为 未认证请求,即使您已登录 WordPress。
注意:直到最近,大多数软件对 DELETE 请求的支持并不完善。例如,PHP 不会将 DELETE 请求的请求体转换为超级全局变量。因此,将 nonce 作为头部提供是最可靠的方法。
重要的是要记住,这种认证方法依赖于 WordPress Cookie。因此,该方法仅适用于在 WordPress 内部使用 REST API 且当前用户已登录的情况。此外,当前用户必须拥有执行该操作所需的相应权限。
作为一个示例,以下是内置 JavaScript 客户端创建 nonce 的方式:
<?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 );
} );
请注意,您无需在自定义端点内验证 nonce 是否有效。rest_cookie_check_errors() 会自动为您完成此操作。
使用应用密码的 Basic Authentication
自 5.6 版本起,WordPress 附带了 应用密码(Application Passwords),可以从“编辑用户”页面生成(wp-admin -> 用户 -> 编辑用户)。
凭证可以通过 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。
还有一个 Basic Authentication 插件。
注意,此插件要求每次请求都发送用户名和密码,仅应用于开发和测试,即不适用于生产环境。建议使用应用密码(见上文)。