Instrukcje: wysyłanie uwierzytelnionych żądań JWT do interfejsu API Wordpress


17

To nie jest tak naprawdę pytanie, ale przewodnik, jak wysyłać uwierzytelnione żądania do Wordpress API przy użyciu JWT. Piszę to jako przypomnienie dla siebie i dla tych, którzy mogą potrzebować pomocy w tym samym temacie.


3
Powinieneś sformatować to jako pytanie, a następnie opublikować rozwiązanie jako rzeczywistą odpowiedź. W przeciwnym razie wygląda to na pytanie bez odpowiedzi.
Jacob Peattie

2
Jest też ten świetny przewodnik firxworx.com/blog/wordpress/…
Armando

Odpowiedzi:


19

Dlaczego uwierzytelnianie JWT

Tworzę witrynę, która używa Wordpress jako zaplecza, a aplikacja React + Redux jako interfejs, więc ściągam całą zawartość z interfejsu, przesyłając żądania do interfejsu API Wordpress. Niektóre żądania (głównie żądania POST) muszą zostać uwierzytelnione, kiedy natrafiłem na JWT.

Czego potrzebujemy

Aby korzystać z uwierzytelniania JWT z Wordpress, najpierw musimy zainstalować wtyczkę JWT Authentication dla WP REST API . Jak wyjaśniono w instrukcjach wtyczki, musimy również zmodyfikować niektóre podstawowe pliki Wordpress. W szczególności:

W pliku .htaccess zawartym w folderze głównym instalacji Wordpress musimy dodać następujące wiersze:

RewriteEngine on
RewriteCond %{HTTP:Authorization} ^(.*)
RewriteRule ^(.*) - [E=HTTP_AUTHORIZATION:%1]

W pliku wp-config.php, również zawartym w folderze głównym instalacji Wordpress, musimy dodać następujące linie:

define('JWT_AUTH_SECRET_KEY', 'your-top-secret-key'); // Replace 'your-top-secret-key' with an actual secret key.
define('JWT_AUTH_CORS_ENABLE', true);

Testowanie, czy JWT jest dostępny

Aby sprawdzić, czy możemy teraz korzystać z JWT, uruchom Postmana i zgłoś żądanie do domyślnego „indeksu” interfejsu API Wordpress:

http://example.com/wp-json/

Kilka nowych punktów końcowych, takich jak /jwt-auth/v1i /jwt-auth/v1/tokenpowinno być dodanych do interfejsu API. Jeśli możesz je znaleźć w odpowiedzi na powyższe żądanie, oznacza to, że JWT jest już dostępny.

Zdobywanie tokena JWT

Pozostańmy na chwilę w Listonoszu i poprośmy o token do interfejsu API Wordpress:

http://example.com/wp-json/jwt-auth/v1/token

Odpowiedź będzie zawierać token JWT, który jest zaszyfrowanym kluczem, który wygląda mniej więcej tak:

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwOlwvXC9sb2NhbGhvc3Q6ODg4OFwvZm90b3Jvb20tbmV4dCIsImlhdCI6MTUyMjU5NzQ1MiwibmJmIjoxNTIyNTk3NDUyLCJleHAiOjE1MjMyMDIyNTIsImRhdGEiOnsidXNlciI6eyJpZCI6IjEifX19.hxaaT9iowAX1Xf8RUM42OwbP7QgRNxux8eTtKhWvEUM

Zgłaszanie uwierzytelnionego wniosku

Spróbujmy zmienić tytuł posta o identyfikatorze 300 jako przykład uwierzytelnionego żądania w JWT.

W programie Listonosz wybierz metodę POST i wpisz następujący punkt końcowy:

http://example.com/wp-json/wp/v2/posts/300

Wybierz opcję Brak uwierzytelnienia na karcie Autoryzacja i dodaj następujące elementy na karcie Nagłówki:

'Content-type': 'application/json', 
'Authorization': 'Bearer jwtToken' // Replace jwtToken with the actual token (the encrypted key above)

Na koniec w zakładce Body wybierz opcje raw i JSON (application / json), a następnie w edytorze tuż pod opcjami wpisz:

{ "title": "YES! Authenticated requests with JWT work" }

Teraz możesz nacisnąć WYŚLIJ. Przejrzyj zakładkę odpowiedzi ze wszystkimi danymi na temat postu, o który poprosiliśmy: wartość klucza tytułu powinna teraz wynosićYES! Authenticated requests with JWT work


2
Jak rozróżniłbyś połączenia, które muszą być uwierzytelnione i takie, które nie muszą być uwierzytelniane w back-endie?
uruk

Tworzę również aplikację React, która pobiera dane postów z bazy danych WordPress przy użyciu interfejsu API REST WordPress, jednak nie chcę, aby punkty końcowe interfejsu API REST były publicznie dostępne. Czy istnieje sposób ograniczenia dostępu do interfejsu API REST oprócz mojej aplikacji React?
Chris

@chris Jeśli chcesz, aby punkty końcowe mają być ukryte przed nieupoważnionym wniosków, dodaj je pod nazw jwt_auth, czyli tak: register_rest_route( 'jwt-auth/v1', 'your_custom_endpoint ... . Wszystko w / jwt-auth / będzie wymagało autoryzacji
Athoxx,

4

Uzupełniając odpowiedź @ grazianodev, otrzymujesz token autoryzacji za pomocą cURL:

/**
*   Generate a JWT token for future API calls to WordPress
*/
private function getToken() {
    $ch = curl_init();

    curl_setopt($ch, CURLOPT_URL,'https://site.localhost/wp-json/jwt-auth/v1/token');
    curl_setopt($ch, CURLOPT_POST, 1);

    # Admin credentials here
    curl_setopt($ch, CURLOPT_POSTFIELDS, "username=admin&password=Str0ngPass"); 

    // receive server response ...
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

    $server_output = curl_exec ($ch);
    if ($server_output === false) {
        die('Error getting JWT token on WordPress for API integration.');
    }
    $server_output = json_decode($server_output);

    if ($server_output === null && json_last_error() !== JSON_ERROR_NONE) {
        die('Invalid response getting JWT token on WordPress for API integration.');
    }

    if (!empty($server_output->token)) {
        $this->token = $server_output->token; # Token is here
        curl_close ($ch);
        return true;
    } else {
        die('Invalid response getting JWT token on WordPress for API integration.');
    }
    return false;
}

Następnie wyślij prośby z nagłówkiem: „Autoryzacja: token na okaziciela $”

Gdzie $ token to token zwrócony przez powyższą funkcję getToken ().

Osobiście używam wtyczki „ Wyłącz interfejs API REST i wymagaj uwierzytelnienia JWT / OAuth ”, aby ograniczyć dostęp do interfejsu API tylko za pomocą powyższego tokena.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.