Jak skonfigurować i używać WordPress REST API: uwierzytelnianie podstawowe

Opublikowany: 2020-02-26
wordpress reszta api
Obserwuj @Cloudways

W poprzednich częściach tej serii omówiłem wprowadzenie WordPress REST API i Fetch Posts w WordPress REST API.

W tej części serii o WordPress REST API omówię, jak skonfigurować podstawowe protokoły uwierzytelniania na serwerze, aby można było skonfigurować REST API i utrzymywać bezpieczną komunikację z różnymi podmiotami i kanałami.

  1. Co to jest uwierzytelnianie?
  2. Uwierzytelnianie za pomocą WordPress REST API
  3. Uwierzytelnianie podstawowe
  4. Jak działa uwierzytelnianie podstawowe?
  5. Zainstaluj wtyczkę WordPress REST API
  6. Wysyłaj uwierzytelnione żądania za pomocą listonosza
  7. Wysyłaj uwierzytelnione żądania za pomocą JavaScript
  8. Wysyłaj uwierzytelnione żądania za pomocą WordPress HTTP API
  9. Uwierzytelnianie plików cookie

Zacznę jednak ten samouczek od pewnej teoretycznej dyskusji na temat definicji uwierzytelniania.

Co to jest uwierzytelnianie?

W kontekście technologii informacyjno-komunikacyjnych (ICT) uwierzytelnianie to idea i proces weryfikacji poświadczeń osoby lub podmiotu, który prosi o dostęp do określonego systemu.

Ważne jest, aby zrozumieć, że uwierzytelnianie różni się od autoryzacji. Kiedy dana osoba jest uwierzytelniana na określonym serwerze hostingowym WordPress, otrzymuje dostęp do systemu na poziomie ogólnym. W przeciwieństwie do tego, gdy osoba jest uprawniona, może uzyskać dostęp i korzystać z części lub całości zasobów systemu. Innymi słowy, uwierzytelnianie potwierdza tożsamość, podczas gdy autoryzacja identyfikuje i zapewnia dostęp do zasobów systemu.

W szczególnym kontekście WordPress REST API uwierzytelniony użytkownik może realizować zadania CRUD. Jednak na każdym kroku użytkownik musi udowodnić swoje uprawnienia do uwierzytelniania.

Uwierzytelnianie za pomocą WordPress REST API

WordPress REST API oferuje kilka opcji uwierzytelniania, z których każda jest przeznaczona do określonego celu.

  • Uwierzytelnianie podstawowe
  • Uwierzytelnianie OAuth
  • Uwierzytelnianie plików cookie

W chwili obecnej natywnym sposobem uwierzytelniania WordPress dla użytkowników i ich działań jest weryfikacja za pomocą plików cookie.

Aby korzystać z uwierzytelniania OAuth i uwierzytelniania podstawowego z WordPress REST API, musisz zainstalować określone wtyczki dostępne w grupie GitHub WordPress REST API. Mam nadzieję, że te dwie metody otrzymają natywne wsparcie w kolejnych wersjach WordPress REST API.

Uwierzytelnianie podstawowe

Uwierzytelnianie podstawowe odnosi się do podstawowego typu uwierzytelniania HTTP, w którym poświadczenia logowania są wysyłane wraz z nagłówkami żądania.

Jak działa uwierzytelnianie podstawowe?

W uwierzytelnianiu podstawowym klient żąda adresu URL wymagającego weryfikacji. Serwer z kolei żąda od klienta identyfikacji poprzez wysłanie kodu 401 Not Authorized. W odpowiedzi klient wysyła to samo żądanie z poświadczeniami (w parze nazwa użytkownika:hasło) dołączonymi jako ciąg zakodowany w base64. Ten ciąg jest wysyłany w polu nagłówka autoryzacji w następujący sposób:

Autoryzacja: Podstawowe b3dhaXMuYWxhbUBjbG91ZHdheXMuY29tOmVKNWtuU24zNVc=

Ponieważ ciągi base64 można dekodować bez większego wysiłku, ta metoda uwierzytelniania nie jest zbyt bezpieczna. dlatego te metody powinny być używane tylko w scenariuszach, w których istnieje absolutne zaufanie między serwerem a klientem. Innym ważnym zastosowaniem tej metody jest rozwiązywanie problemów w bezpiecznym systemie.

Doświadcz hostingu WordPress bez ograniczeń

Przenieś go do Cloudways za pomocą naszej bezpłatnej wtyczki do migracji

Zacząć teraz!

Zainstaluj wtyczkę WordPress REST API

Wtyczka WordPress REST API umożliwia dodanie podstawowego uwierzytelniania do witryny WordPress.

Uwaga: „ Bez SSL zdecydowanie zalecamy używanie programu obsługi uwierzytelniania OAuth 1.0a w środowiskach produkcyjnych”.

Wtyczka WordPress REST API jest dostępna z grupy GitHub WordPress REST API. Aby skorzystać z wtyczki, po prostu sklonuj ją w katalogu wtyczek WordPress i aktywuj ją przez administratora WordPress.

Wysyłaj uwierzytelnione żądania za pomocą listonosza

Aby rozpocząć wysyłanie żądań uwierzytelnienia, zainstaluj rozszerzenie Postman Chrome. Sprawia, że ​​tworzenie API jest łatwiejsze, szybsze, inteligentniejsze i lepsze. Dla użytkowników przeglądarki Firefox zainstaluj REST Easy Add-On, który zapewnia w pełni funkcjonalnego klienta REST w przeglądarce.

Podobnie jak większość klientów HTTP, Postman dla Chrome obsługuje natywnie wysyłanie żądań przy użyciu podstawowej metody uwierzytelniania.

Aby wysłać uwierzytelnione żądanie, przejdź do zakładki Autoryzacja pod paskiem adresu:

Uwierzytelnione żądanie

Teraz wybierz Basic Auth z menu rozwijanego. Zostaniesz poproszony o podanie nazwy użytkownika i hasła. Następnie kliknij przycisk Żądanie aktualizacji .

Uwierzytelnianie podstawowe

Po zaktualizowaniu opcji uwierzytelniania zobaczysz zmianę w zakładce Nagłówki . Zakładka będzie teraz zawierała pole nagłówka dla zakodowanej nazwy użytkownika/hasła:

Zaktualizuj uwierzytelnianie

Konfiguracja podstawowego uwierzytelniania w programie Postman została zakończona. Teraz wyślij żądanie testowe (spróbuj usunąć post), które wymaga uwierzytelnienia:

Na przykład – USUŃ http://wordpressmu-19393-42425-140587.cloudwaysapps.com/wp-json/wp/v2/posts/50

Gdzie wordpressmu-19393-42425-140587.cloudwaysapps.com można zastąpić ścieżką twojego serwera deweloperskiego.

Jeśli wszystko pójdzie dobrze, serwer zwróci status 200 OK , co oznacza, że ​​post o id 50 został usunięty:

OK Status

Wysyłaj uwierzytelnione żądania za pomocą JavaScript

JavaScript jest językiem programowania wysokiego poziomu i dlatego w dzisiejszych czasach JavaScript można znaleźć prawie wszędzie. Dlatego bardzo często spotyka się popularne frameworki JavaScript współpracujące z WordPress. Popularnym scenariuszem jest użycie jQuery w interakcji z API WordPress. W takich przypadkach nagłówki autoryzacji mogą być wysyłane w żądaniu AJAX.

Rozważ następujące żądanie DELETE wysłane za pomocą metody jQuery.ajax():

 jQuery.ajax({
   url: 'http://wordpressmu-19393-42425-140587.cloudwaysapps.com/wp-json/wp/v2/posts/50',
   metoda: „USUŃ”,
   crossDomain: prawda,
   przed wysłaniem: funkcja ( xhr ) {
       xhr.setRequestHeader( 'Autoryzacja', 'Podstawowe' + Base64.encode( 'nazwa użytkownika:hasło' ) );
   },
   sukces: funkcja( dane, txtStatus, xhr ) {
       konsola.log(dane);
       console.log( xhr.status );
   }
});

Gdzie Base64 to obiekt używany do kodowania i dekodowania ciągu base64. Jest to zdefiniowane w następujący sposób, tuż przed wywołaniem metody jQuery.ajax():

 var Base64={_keyStr:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",encode:function(e){var t="";var n,r,i,s,o,u,a;var f=0;e=Base_en._utf8 (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}inaczej if(isNaN(i) ){a=64}t=t+this._keyStr.charAt(s)+this._keyStr.charAt(o)+this._keyStr.charAt(u)+this._keyStr.charAt(a)}zwrot 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+=Ciąg. 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.znakKodAt(n+1);c3=e.znakKodAt(n+2);t+=String.fromCharCode((r&15)<<12|(c2&63)<<6|c3&63);n+=3}} zwróć t}};

W powyższym żądaniu ustawiłem nagłówek Authorization za pomocą metody setRequestHeader() dla obiektu xhr przekazanego jako argument do metody beforeSend() .

Oprócz powyższego żądania nagłówki Access-Control-Allow-Headers powinny zezwalać na pole Authorization na serwerze. Można to włączyć, dodając następujący wiersz do pliku WordPress .htaccess:

 Nagłówek zawsze ustawiony Nagłówek autoryzacji Access-Control-Allow-Headers zawsze ustawiony

Po zakończeniu powyższe żądanie spowoduje wyświetlenie odpowiedzi w konsoli przeglądarki

200 Powiadomienie

Kod odpowiedzi statusu 200 zwrócony przez serwer wskazuje, że post o identyfikatorze 52 został pomyślnie usunięty.

Wysyłaj uwierzytelnione żądania za pomocą WordPress HTTP API

W przypadku, gdy łączysz się zdalnie z inną witryną WordPress, najbardziej odpowiednim podejściem jest wysyłanie żądań HTTP za pośrednictwem interfejsu API HTTP WordPress.

Rozważmy następujący kod, który wysyła żądanie DELETE do innej instalacji WordPress z WordPress REST API i włączonym podstawowym uwierzytelnianiem:

 $ wp_request_headers = tablica (
  'Autoryzacja' => 'Podstawowe' . base64_encode( 'nazwa użytkownika:hasło' )
);

$wp_request_url = 'http://wordpressmu-19393-42425-140587.cloudwaysapps.com/wordpress-api/wp-json/wp/v2/posts/50';

$ wp_delete_post_response = wp_remote_request (
  $wp_request_url,
  szyk(
      'metoda' => 'USUŃ',
      'headers' => $ wp_request_headers
  )
);

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

Tutaj użyłem wp_remote_request(), który akceptuje dwa argumenty; $url (adres URL żądania) i $args (tablica zawierająca dodatkowe argumenty do przekazania).

Metodą $ zdefiniowaną w tablicy $args jest DELETE. Tablica $headers zawiera wszystkie pola nagłówka, które mają zostać przekazane z żądaniem. Przekazałem klucz autoryzacyjny z zakodowaną w base64 nazwą użytkownika i ciągiem klucza hasła.

Odpowiedź zostanie zapisana w zmiennej $wp_delete_post_response , której można użyć z funkcjami wp_remote_retrieve_response_code() i wp_remote_retrieve_response_message() . Te dwie funkcje są funkcjami pomocniczymi w API WordPress HTTP i wyodrębniają odpowiednio kod stanu i komunikat o stanie z odpowiedzi.

Jeśli post zostanie pomyślnie usunięty w wyniku powyższego żądania, zostanie wyświetlony następujący tekst:

200 OK

Uwierzytelnianie plików cookie

Uwierzytelnianie za pomocą plików cookie to podstawowa metoda uwierzytelniania dostępna w WordPress. W momencie pomyślnego zalogowania się do pulpitu WordPress ustawiane są prawidłowe pliki cookie. W związku z tym programiści muszą się tylko zalogować w celu uwierzytelnienia.

Jednak REST API zawiera metodę o nazwie nonces, która zajmuje się problemami CSRF. Gwarantuje to, że wszystkie działania na stronie pozostają posegregowane. Wymaga to jednak również starannego obchodzenia się z interfejsem API.

W przypadku programistów korzystających z działającego jako część interfejsu Javascript API, jest to zapewnione naturalnie. Jest to zalecane podejście do korzystania z interfejsu API dla wtyczek i motywów. Niestandardowe modele danych mogą rozciągnąć wp.api.models.Base, aby zagwarantować, że jest to poprawnie wysyłane dla wszelkich niestandardowych żądań.

Deweloperzy wykonujący ręczne wywołania AJAX muszą przekazywać jednorazową wartość z każdym żądaniem. Interfejs API wykorzystuje wartość jednorazową z aktywnością ustawioną na wp_rest . Można je następnie przekazać do interfejsu API za pomocą parametru danych _wpnonce (dane POST lub w zapytaniu dla żądań GET) lub za pomocą nagłówka X-WP-Nonce .

Uwaga: do niedawna wiele programów miało pobieżne wsparcie dla żądań DELETE. Na przykład PHP nie przekształca treści żądania DELETE w superglobal. W związku z tym podanie wartości jednorazowej jako nagłówka jest najbardziej niezawodnym podejściem w tym scenariuszu.

Należy pamiętać, że ta strategia potwierdzenia zależy od plików cookie WordPress. Tak więc metoda ta ma zastosowanie tylko wtedy, gdy w WordPressie jest używane REST API, a aktualny użytkownik jest zalogowany. Co więcej, aktualny użytkownik musi mieć odpowiednią autoryzację dla wykonywanej czynności.

Na przykład tak wbudowany klient JavaScript tworzy nonce:

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

Oto przykład edycji tytułu posta za pomocą jQuery AJAX:

 $.ajax( {
   url: wpApiSettings.root + 'wp/v2/posts/50',
   metoda: 'POST',
   przed wysłaniem: funkcja ( xhr ) {
       xhr.setRequestHeader( 'X-WP-Nonce', wpApiSettings.nonce );
   },
   dane:{
       'title' : 'Witaj Chmury'
   }
} ).wykonane( funkcja ( odpowiedź ) {
   konsola.log(odpowiedź);
} );

Wniosek

WordPress REST API jest prawdopodobnie najpopularniejszym i najszerzej używanym API REST na świecie. Jest dostępny dla każdego, kto korzysta z WordPressa w sklepach internetowych i aplikacjach internetowych.

Mam nadzieję, że zrozumiałeś to, co napisałem w tym artykule. Jeśli nadal masz pytanie dotyczące tematu lub chciałbyś wziąć udział w dyskusji, zostaw komentarz poniżej.