Cum să: Faci cereri autentificate JWT către API-ul WordPress

1 apr. 2018, 20:30:44
Vizualizări: 39.7K
Voturi: 27

Acesta nu este propriu-zis o întrebare, ci un ghid despre cum să faci cereri autentificate către API-ul WordPress folosind JWT. Scriu acest articol ca memento pentru mine și pentru cei care ar putea avea nevoie de ajutor pe această temă.

2
Comentarii

Ar trebui să formatezi acest lucru ca o întrebare, apoi să postezi soluția ca un răspuns real. Altfel, arată ca o întrebare fără răspuns.

Jacob Peattie Jacob Peattie
2 apr. 2018 10:26:03

Există și acest ghid util https://firxworx.com/blog/wordpress/using-the-wordpress-rest-api-with-jwt-authentication/

Way Too Simple Way Too Simple
15 feb. 2019 20:16:17
Toate răspunsurile la întrebare 2
7
34

De ce autentificare JWT

Construiesc un site care folosește WordPress ca back-end și o aplicație React+Redux ca front-end, așa că preiau tot conținutul în front-end prin cereri către API-ul WordPress. Unele cereri (în special, cererile POST) trebuie să fie autentificate, moment în care am dat peste JWT.

De ce avem nevoie

Pentru a folosi autentificarea JWT cu WordPress, mai întâi trebuie să instalăm plugin-ul JWT Authentication for WP REST API. După cum se explică în instrucțiunile plugin-ului, trebuie să modificăm și unele fișiere de bază WordPress. În special:

În fișierul .htaccess din folderul rădăcină al instalării WordPress, trebuie să adăugăm următoarele linii:

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

În fișierul wp-config.php, tot din folderul rădăcină al instalării WordPress, trebuie să adăugăm aceste linii:

define('JWT_AUTH_SECRET_KEY', 'your-top-secret-key'); // Înlocuiți 'your-top-secret-key' cu o cheie secretă reală.
define('JWT_AUTH_CORS_ENABLE', true);

Testarea disponibilității JWT

Pentru a verifica dacă putem folosi acum JWT, porniți Postman și faceți o cerere la 'index'-ul implicit al API-ului WordPress:

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

Câteva endpoint-uri noi, cum ar fi /jwt-auth/v1 și /jwt-auth/v1/token, ar fi trebuit să fie adăugate la API. Dacă le găsiți în răspunsul la cererea de mai sus, înseamnă că JWT este acum disponibil.

Obținerea token-ului JWT

Să rămânem în Postman pentru moment și să solicităm un token de la API-ul WordPress:

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

Răspunsul va conține token-ul JWT, care este o cheie criptată care arată cam așa:

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwOlwvXC9sb2NhbGhvc3Q6ODg4OFwvZm90b3Jvb20tbmV4dCIsImlhdCI6MTUyMjU5NzQ1MiwibmJmIjoxNTIyNTk3NDUyLCJleHAiOjE1MjMyMDIyNTIsImRhdGEiOnsidXNlciI6eyJpZCI6IjEifX19.hxaaT9iowAX1Xf8RUM42OwbP7QgRNxux8eTtKhWvEUM

Efectuarea unei cereri autentificate

Să încercăm să schimbăm titlul unui post cu ID-ul 300 ca exemplu de cerere autentificată cu JWT.

În Postman, alegeți POST ca metodă și tastați următorul endpoint:

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

Alegeți No Auth în fila Authorization și adăugați următoarele în fila Headers:

'Content-type': 'application/json', 
'Authorization': 'Bearer jwtToken' // Înlocuiți jwtToken cu token-ul real (cheia criptată de mai sus)

În final, în fila Body, selectați opțiunile raw și JSON (application/json), apoi în editorul de sub opțiuni tastați următoarele:

{ "title": "DA! Cererile autentificate cu JWT funcționează" }

Acum puteți apăsa SEND. Verificați în fila de răspuns cu toate datele despre postarea pe care am solicitat-o: valoarea pentru cheia title ar trebui să fie acum DA! Cererile autentificate cu JWT funcționează

27 apr. 2018 09:36:37
Comentarii

Cum ai face diferența între apelurile care trebuie să fie autentificate și cele care nu trebuie să fie autentificate în back-end?

uruk uruk
11 iul. 2018 23:59:05

De asemenea, construiesc o aplicație React care preia datele postărilor din baza de date WordPress folosind WordPress REST API, dar nu vreau ca punctele de acces ale REST API să fie disponibile public. Există vreo modalitate de a restricționa accesul la REST API, cu excepția aplicației mele React?

Chris Chris
12 iul. 2018 14:07:12

@chris Dacă dorești ca punctele tale de acces să fie ascunse de cererile neautorizate, adaugă-le sub namespace-ul jwt_auth, de exemplu astfel: register_rest_route( 'jwt-auth/v1', 'your_custom_endpoint .... Orice se află sub /jwt-auth/ va necesita autorizare

InanisAtheos InanisAtheos
19 sept. 2019 23:39:09

@uruk odată ce ai tokenul JWT, cred că îl poți trimite mereu, așa că nu e nevoie să faci distincție între ce este necesar și ce nu.

Lai32290 Lai32290
2 mai 2020 13:38:18

După cum văd, acest plugin nu a fost actualizat de mult timp, mai este sigur să-l folosești?

Lai32290 Lai32290
2 mai 2020 13:39:26

@Lai32290 Acest plugin pare să fie actualizat și se bazează pe plugin-ul menționat în această întrebare: https://wordpress.org/plugins/jwt-auth/

epsilon42 epsilon42
12 oct. 2020 07:14:08

@uruk așa am realizat distincția între apelurile care trebuie autentificate și cele care nu necesită, fără plugin: Cum să forțezi Autentificarea pe REST API pentru pagini protejate cu parolă folosind tabelă personalizată și fetch() fără Plugin

Jürgen Fink Jürgen Fink
7 iul. 2021 19:14:11
Arată celelalte 2 comentarii
0

Complementând răspunsul lui @grazianodev, iată cum poți obține token-ul de autorizare folosind cURL:

/**
*   Generează un token JWT pentru apelurile viitoare către API-ul 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);

    # Credențiale de administrator aici
    curl_setopt($ch, CURLOPT_POSTFIELDS, "username=admin&password=Str0ngPass"); 

    // primește răspunsul de la server ...
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

    $server_output = curl_exec ($ch);
    if ($server_output === false) {
        die('Eroare la obținerea token-ului JWT pe WordPress pentru integrarea API.');
    }
    $server_output = json_decode($server_output);

    if ($server_output === null && json_last_error() !== JSON_ERROR_NONE) {
        die('Răspuns invalid la obținerea token-ului JWT pe WordPress pentru integrarea API.');
    }

    if (!empty($server_output->token)) {
        $this->token = $server_output->token; # Token-ul este aici
        curl_close ($ch);
        return true;
    } else {
        die('Răspuns invalid la obținerea token-ului JWT pe WordPress pentru integrarea API.');
    }
    return false;
}

După aceea, trimite cererile cu header-ul: "Authorization: Bearer $token"

Unde $token este token-ul returnat de funcția getToken() de mai sus.

Personal, folosesc plugin-ul "Disable REST API and Require JWT / OAuth Authentication" pentru a restricționa accesul la API doar cu token-ul de mai sus.

29 iul. 2018 02:17:33