WP REST API:设置和使用基本身份验证

在本系列的入门部分中,我们对REST体系结构及其如何帮助我们创建更好的应用程序进行了快速复习。 然后,我们探索了WordPress中REST API的历史,并向自己介绍了最新的功能:WP REST API插件。 我们为插件测试设置了一个基本的工作环境,其中包括插件安装和用于发送请求或查看服务器响应的HTTP客户端。

在本系列的当前部分中,我们将在服务器上设置基本身份验证协议,以发送经过身份验证的请求,以通过REST API执行各种任务。

具体而言,在这一部分中,我们将:

  • 查看使用REST API插件时可用的各种身份验证方法
  • 在服务器上设置基本身份验证
  • 使用邮递员发送经过身份验证的请求
  • 使用JavaScript框架发送经过身份验证的请求
  • 使用命令行发送经过身份验证的请求
  • 使用WP HTTP API发送经过身份验证的请求

但是,让我们先来看一下身份验证本身。

什么是身份验证?

在最基本的定义中,认证是确定一个人身份的过程。

根据Webopedia

识别个人的过程,通常基于用户名和密码。 在安全系统中,身份验证与授权不同,授权是根据个人的身份授予个人访问系统对象的过程。 身份验证仅能确保个人是他或她所声称的身份,而对于个人的访问权限则一无所知。

在谈论WP REST API时,具有足够特权的用户可以执行各种CRUD任务,例如创建帖子,检索站点的所有用户或撤销用户的权限。 但是对于所有这些操作,必须向服务器证明其身份,这就是身份验证的作用。

如果没有适当的身份验证,那么对野心勃勃的人来说,很容易弄乱站点,因此身份验证会提供必要的安全层,以限制用户的权限和可以执行的操作。

使用WP REST API进行身份验证

WP REST API提供了三个身份验证选项,每个选项均用于特定目的。 这些选项是:

  • 基本认证
  • OAuth验证
  • cookie认证

现在,使用WordPress进行身份验证的本机方法是通过cookie进行身份验证。 这就是WordPress确定用户身份以及用户可以执行的操作的方式。 要将上面列出的其他两种身份验证方法与WP REST API一起使用,我们需要安装GitHub上的WP REST API团队提供的相应插件。 希望这两种方法也将包含在REST API插件本身的WordPress核心中。

基本身份验证是HTTP身份验证的最基本类型,其中登录凭据与请求的标头一起发送。

基本身份验证的工作方式

在基本身份验证中,客户端请求一个需要身份验证的URL。 服务器通过发送401-未授权代码来请求客户端(或用户代理)进行身份验证。 作为回报,客户端发送回相同的请求,但具有登录凭证,作为base64编码的字符串,格式为username:password 。 此字符串按以下方式在“ Authorization标头字段中发送:

Authorization: Basic {base64_encode(username:password)}

因此,如果用户名是tutsplus ,密码是123456 ,则以下标头字段将与请求一起发送:

Authorization: Basic dHV0c3BsdXM6MTIzNDU2

由于base64编码的字符串可以轻松解码,因此此方法在开放式网络上使用时非常不安全。 因此,仅当服务器和客户端之间的连接受信任时,才应将此方法用于调试和开发目的。

安装插件

如上所述,该插件可从WP REST API团队在GitHub上获得。 因此,我们要做的就是将其克隆到我们的plugins目录中并激活它。

转到您的/wp-content/plugins/目录,并克隆您可能需要sudo权限才能运行命令的插件。 为此,发出以下命令:

$ sudo git clone https://github.com/WP-API/Basic-Auth.git

终端将要求您输入密码。 输入密码,然后将存储库克隆到目录中。

克隆插件后,请转到WP Admin激活它。 现在,基本的HTTP身份验证方法可以与REST API插件一起使用。

使用邮递员发送经过身份验证的请求

大多数HTTP客户端都支持原生使用基本身份验证方法发送请求,Postman for Chrome也是如此。 要发送经过身份验证的请求,请转到地址栏下方的“ 授权”标签:

授权标签

现在,从下拉菜单中选择基本身份验证 。 系统将要求您输入用户名和密码。 输入凭据后,单击更新请求按钮。

基本认证

更新身份验证选项后,您将在“ 标题”选项卡中看到一个更改,它现在包括一个标题字段,其中包含编码的用户名和密码字符串:

授权标题

这就是我们如何使用Postman设置基本身份验证的全部内容。 现在,您可以发送测试请求,例如删除帖子,这需要身份验证:

DELETE http://dev-server/wp-json/wp/v2/posts/52

dev-server是开发服务器的路径。

如果一切顺利,服务器将返回200 OK状态代码,表明ID为52的帖子已被删除:

帖子已创建

不用担心我们在这里提出的要求,我们将在本系列的后续部分中详细介绍它。

从命令行发送经过身份验证的请求

我们可以使用此方法通过命令行发送经过身份验证的请求。 考虑以下等同于上述请求的curl

curl --request DELETE -I --user  admin:password http://dev-server/wp-json/wp/v2/posts/52

服务器将发送以下响应,表明一切正常:

HTTP/1.1 200 OK
Date: Fri, 28 Aug 2015 20:02:43 GMT
Server: Apache/2.4.6 (CentOS) PHP/5.6.12
X-Powered-By: PHP/5.6.12
Set-Cookie: PHPSESSID=k0rg6mcbsie7ufvoav219lqre0; path=/
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
X-Content-Type-Options: nosniff
Link: <http://localserver/wordpress-api/demo-post-28/>; rel="alternate"; type=text/html
Allow: GET, POST, PUT, PATCH, DELETE
Transfer-Encoding: chunked
Content-Type: application/json; charset=UTF-8

--request选项指定要使用的请求方法,在本例中为DELETE 。 您也可以使用-X替代--request选项。

-I选项仅获取服务器发送的HTTP标头。 -I的替代项是--head选项。

使用JavaScript发送经过身份验证的请求

如果您使用客户端JavaScript框架(例如jQuery)与启用了WP API的WordPress站点进行远程交互,则可以在AJAX请求中发送授权标头。 考虑以下通过jQuery.ajax()方法发送的DELETE请求:

$.ajax({
    url: 'http://dev-server/wp-json/wp/v2/posts/52',
	method: 'DELETE',
	crossDomain: true,
	beforeSend: function ( xhr ) {
    	xhr.setRequestHeader( 'Authorization', 'Basic ' + Base64.encode( 'username:password' ) );
	},
	success: function( data, txtStatus, xhr ) {
		console.log( data );
		console.log( xhr.status );
	}
});

其中Base64是用于编码和解码base64字符串的对象。 在上述jQuery.ajax()方法调用之前,其定义如下:

var Base64={_keyStr:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",encode:function(e){var t="";var n,r,i,s,o,u,a;var f=0;e=Base64._utf8_encode(e);while(f<e.length){n=e.charCodeAt(f++);r=e.charCodeAt(f++);i=e.charCodeAt(f++);s=n>>2;o=(n&3)<<4|r>>4;u=(r&15)<<2|i>>6;a=i&63;if(isNaN(r)){u=a=64}else if(isNaN(i)){a=64}t=t+this._keyStr.charAt(s)+this._keyStr.charAt(o)+this._keyStr.charAt(u)+this._keyStr.charAt(a)}return t},decode:function(e){var t="";var n,r,i;var s,o,u,a;var f=0;e=e.replace(/[^A-Za-z0-9\+\/\=]/g,"");while(f<e.length){s=this._keyStr.indexOf(e.charAt(f++));o=this._keyStr.indexOf(e.charAt(f++));u=this._keyStr.indexOf(e.charAt(f++));a=this._keyStr.indexOf(e.charAt(f++));n=s<<2|o>>4;r=(o&15)<<4|u>>2;i=(u&3)<<6|a;t=t+String.fromCharCode(n);if(u!=64){t=t+String.fromCharCode(r)}if(a!=64){t=t+String.fromCharCode(i)}}t=Base64._utf8_decode(t);return t},_utf8_encode:function(e){e=e.replace(/\r\n/g,"\n");var t="";for(var n=0;n<e.length;n++){var r=e.charCodeAt(n);if(r<128){t+=String.fromCharCode(r)}else if(r>127&&r<2048){t+=String.fromCharCode(r>>6|192);t+=String.fromCharCode(r&63|128)}else{t+=String.fromCharCode(r>>12|224);t+=String.fromCharCode(r>>6&63|128);t+=String.fromCharCode(r&63|128)}}return t},_utf8_decode:function(e){var t="";var n=0;var r=c1=c2=0;while(n<e.length){r=e.charCodeAt(n);if(r<128){t+=String.fromCharCode(r);n++}else if(r>191&&r<224){c2=e.charCodeAt(n+1);t+=String.fromCharCode((r&31)<<6|c2&63);n+=2}else{c2=e.charCodeAt(n+1);c3=e.charCodeAt(n+2);t+=String.fromCharCode((r&15)<<12|(c2&63)<<6|c3&63);n+=3}}return t}};

我在StackOverflow上找到了它,这是一种跨浏览器方式,用于在JavaScript中编码和解码base64字符串。

在上述请求中,我们使用xhr对象的setRequestHeader()方法(作为参数传递给beforeSend()方法beforeSend()来设置Authorization标头。

除上述请求外, Access-Control-Allow-Headers头还应允许服务器上的Authorization字段。 可以通过在WordPress .htaccess文件中添加以下代码行来启用此功能:

Header always set Access-Control-Allow-Headers Authorization Header always set

以上请求完成后,将在浏览器的控制台中回显响应,如下图所示:

服务器响应

服务器返回的200状态响应代码表明ID为52的帖子已成功删除。

使用WP HTTP API发送经过身份验证的请求

如果要通过WordPress安装与另一个WordPress站点进行远程交互,则发送HTTP请求的最合适方法是WP HTTP API。

考虑以下代码,该代码在启用WP REST API和基本身份验证的情况下向另一个WordPress安装发送DELETE请求:

$wp_request_headers = array(
    'Authorization' => 'Basic ' . base64_encode( 'username:password' )
);

$wp_request_url = 'http://localserver/wordpress-api/wp-json/wp/v2/posts/52';

$wp_delete_post_response = wp_remote_request(
	$wp_request_url,
	array(
		'method'	=> 'DELETE',
		'headers' 	=> $wp_request_headers
	)
);

echo wp_remote_retrieve_response_code( $wp_delete_post_response ) . ' ' . wp_remote_retrieve_response_message( $wp_delete_post_response );

在这里,我们使用了wp_remote_request()函数,该函数接受两个参数:

  • $url :请求的URL
  • $args :要传递的其他参数数组

$args数组中定义的$methodDELETE ,并且应始终以大写形式编写。 $headers数组采用要与请求一起传递的所有标头字段的键值对。 我们已经传递了Authorization密钥,并使用base64编码的用户名和密码字符串作为其值。

响应将保存在$wp_delete_post_response变量中,我们可以将其与wp_remote_retrieve_response_code()wp_remote_retrieve_response_message()函数一起使用。 这两个函数是WP HTTP API中的帮助器函数,它们分别从响应中提取状态代码和状态消息。

如果以上请求成功删除了该帖子,则将回显以下文本:

200 OK

这就是WP REST API支持的基本身份验证方法。 除非另有说明,否则由于其简单性,我们将在以后的部分中使用相同的身份验证方法来检索,创建或修改数据。

结论

在本系列的当前部分中,我们仔细研究了WP REST API支持的基本HTTP身份验证方法。 但是,由于base64编码的字符串很容易被解码,并且您的凭据可能落入错误的人手中,因此不应在实时生产环境中使用它。

在成功设置并测试了HTTP基本身份验证方法之后,我们准备进一步采取措施,并设置一种更复杂的身份验证方法-OAuth 1.0a方法。 我们将在本系列的下一部分中进行介绍,敬请期待!

翻译自: https://code.tutsplus.com/tutorials/wp-rest-api-setting-up-and-using-basic-authentication--cms-24762

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值