验证
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。
笔记:
还有一个基本身份验证插件。
请注意,此插件需要在每次请求时发送您的用户名和密码,并且只能用于开发和测试,即不能用于生产环境。首选使用应用程序密码(见上文)。