>웹 프론트엔드 >JS 튜토리얼 >기본 인증으로 WP REST API 설정 및 사용

기본 인증으로 WP REST API 설정 및 사용

PHPz
PHPz원래의
2023-08-28 10:17:05924검색

이 시리즈의 소개 부분에서는 REST 아키텍처를 간략하게 검토하고 이것이 더 나은 애플리케이션을 만드는 데 어떻게 도움이 되는지 살펴보았습니다. 그런 다음 WordPress에서 REST API의 역사를 살펴보고 최신 추가 사항인 WP REST API 플러그인을 소개했습니다. 우리는 플러그인 설치와 요청을 보내거나 서버 응답을 보기 위한 HTTP 클라이언트를 포함하는 플러그인 테스트를 위한 기본 작업 환경을 설정했습니다.

이 시리즈의 현재 부분에서는 서버에 기본 인증 프로토콜을 설정하여 REST API를 통해 다양한 작업을 수행하기 위한 인증된 요청을 보냅니다.

이 섹션에서는 구체적으로 다음을 수행합니다.

  • REST API 플러그인 사용 시 사용할 수 있는 다양한 인증 방법 보기
  • 서버에 기본 인증 설정하기
  • Postman을 사용하여 인증된 요청 보내기
  • JavaScript 프레임워크를 사용하여 인증된 요청 보내기
  • 명령줄을 사용하여 인증된 요청 보내기
  • WP HTTP API를 사용하여 인증된 요청 보내기

그럼 먼저 인증 자체부터 살펴보겠습니다.

인증이란 무엇인가요?

가장 기본적인 정의에서 신원 확인은 개인의 신원을 확인하는 프로세스입니다.

인터넷 백과사전에 따르면:

일반적으로 사용자 이름과 비밀번호를 기반으로 개인을 식별하는 프로세스입니다. 보안 시스템에서 인증은 개인의 신원을 기반으로 시스템 개체에 대한 액세스 권한을 개인에게 부여하는 프로세스인 권한 부여와 다릅니다. 인증은 개인이 자신이 주장하는 사람인지 확인만 할 뿐 개인의 액세스 권한을 지정하지는 않습니다.

WP REST API에 대해 말하자면, 충분한 권한이 있는 사용자는 게시물 작성, 사이트의 모든 사용자 검색, 사용자 권한 취소 등 다양한 CRUD 작업을 수행할 수 있습니다. 그러나 이러한 모든 작업을 수행하려면 사용자는 서버에 자신의 신원을 증명해야 하며 여기서 인증이 중요합니다.

적절한 인증이 없으면 악의적인 야망을 가진 사람이 웹 사이트를 손상시키기 쉽기 때문에 인증은 사용자의 권한과 수행할 수 있는 작업을 제한하는 데 필요한 보안 계층을 제공합니다.

인증을 위해 WP REST API를 사용하세요

WP REST API는 각각 특정 목적을 가진 세 가지 인증 옵션을 제공합니다. 옵션은 다음과 같습니다:

  • 기본인증
  • OAuth 인증
  • 쿠키인증

현재 WordPress를 인증하는 기본 방법은 쿠키 인증을 이용하는 것입니다. 이것이 WordPress가 사용자가 누구인지, 사용자가 수행할 수 있는 작업을 결정하는 방법입니다. WP REST API와 함께 위에 나열된 다른 두 가지 인증 방법을 사용하려면 GitHub의 WP REST API 팀에서 제공하는 해당 플러그인을 설치해야 합니다. 두 가지 방법 모두 REST API 플러그인 자체를 통해 WordPress 코어에도 포함될 수 있기를 바랍니다.

기본 인증은 요청 헤더와 함께 로그인 자격 증명이 전송되는 가장 기본적인 유형의 HTTP 인증입니다.

기본 인증 작동 방식

기본 인증에서는 클라이언트가 인증이 필요한 URL을 요청합니다. 서버는 클라이언트(또는 사용자 에이전트)에게 401-Not Authorized 코드를 전송하여 자신을 인증하도록 요청합니다. 그 대가로 클라이언트는 동일한 요청을 다시 보내지만 로그인 자격 증명은 Base64로 인코딩된 문자열 형식으로 用户名:password。该字符串在 Authorization 헤더 필드에 다음과 같이 전송됩니다.

으아악

따라서 사용자 이름이 tutsplus 并且密码是 123456인 경우 다음 헤더 필드가 요청과 함께 전송됩니다.

으아악

base64로 인코딩된 문자열은 쉽게 디코딩될 수 있으므로 이 방법은 개방형 네트워크에서 사용하기에 매우 안전하지 않습니다. 따라서 이 방법은 서버와 클라이언트 간의 연결을 신뢰할 수 있는 경우 디버깅 및 개발 목적으로만 사용해야 합니다.

플러그인 설치

위에서 언급했듯이 WP REST API 팀은 GitHub에서 플러그인을 제공합니다. 따라서 우리가 해야 할 일은 이를 plugins 디렉터리에 복제하고 활성화하는 것뿐입니다.

플러그인에 대한 명령을 실행하려면 /wp-content/plugins/ 目录并克隆您可能需要 sudo 권한으로 이동하세요. 이렇게 하려면 다음 명령을 실행하세요:

으아악

단말기에 비밀번호를 입력하라는 메시지가 표시됩니다. 비밀번호를 입력하고 저장소를 디렉터리에 복제하세요.

플러그인을 복제한 후 WP 관리자를 통해 활성화하세요. 이제 REST API 플러그인에서 기본 HTTP 인증 방법을 사용할 수 있습니다.

Postman을 사용하여 인증된 요청 보내기

대부분의 HTTP 클라이언트는 Chrome용 Postman과 마찬가지로 기본 인증 방법을 사용하여 요청 보내기를 기본적으로 지원합니다. 인증된 요청을 보내려면 주소 표시줄 아래의 인증탭으로 이동하세요.

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

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

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

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

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

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

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

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

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

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

不用担心我们在这里提出的请求 - 我们将在以后的部分中更详细地讨论它该系列。

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

我们可以使用命令行使用此方法发送经过身份验证的请求。考虑以下与上述请求等效的 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() 方法作为参数传递给 Authorization 标头beforeSend() 方法。

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

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

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

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

服务器返回的200状态响应代码显示id为52已成功删除。

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

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

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

$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 数组中定义的 $method 数组是 DELETE,并且应始终以大写形式书写。 $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 方法。我们将在本系列的下一部分中做到这一点,敬请期待!

위 내용은 기본 인증으로 WP REST API 설정 및 사용의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.