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.
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.
Odpowiedzi:
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/v1
i /jwt-auth/v1/token
powinno 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
register_rest_route( 'jwt-auth/v1', 'your_custom_endpoint ...
. Wszystko w / jwt-auth / będzie wymagało autoryzacji
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.