WP-API și Basic Auth returnează 403 la POST dar nu la GET - Soluții

24 oct. 2015, 00:47:15
Vizualizări: 14.1K
Voturi: 2

Folosesc ultima versiune de WP-API și Basic Auth recomandat, pentru a testa adăugarea unui post în WP de la distanță.

Am deschis headerele de Access pe partea de WP:

header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Methods: GET, POST, PUT, DELETE");
header("Access-Control-Allow-Headers: Authorization, Content-Type");

Când trimit un request GET la: http://sandbox.ravennainteractive.com/wp-json/wp/v2/posts apelul se autentifică ușor și returnează postul Hello World.

Când trimit un request POST la același URL, primesc o eroare. Iată apelul meu AJAX cu jQuery:

$('#test-post').submit(function(e){
    e.preventDefault();

    var title = $( '#title' ).val();
    var content = $( '#content_raw' ).val();

    var postData = {
        title: title,
        content: content
    }

    console.log(postData);

    $.ajax({
        method: 'POST',
        contentType: 'application/json',
        data: postData,
        url: sandboxUrl,
        beforeSend: function( xhr ) {
           xhr.setRequestHeader ('Authorization', 'Basic '+ btoa( 'apiuser' + ':' + 'PASSWORD' ));
        },
        success: function(data){
            console.log(data);
            alert('Comentariul tău a fost adăugat cu succes');
        },
        error: function(data){
            console.log(data);
            alert('A apărut o eroare la adăugarea comentariului');
        }
    });

    return false;
});

Răspunsul este: Failed to load resource: the server responded with a status of 403 (Forbidden)

Array[0]responseText: "[{"code":"rest_forbidden","message":"Nu ai permisiunea să faci asta.","data":{"status":403}}]"

Dacă rulez acest bloc de cod, eliminând elementele inutile, interogarea funcționează și returnează postul Hello World.

$('#test-post').submit(function(e){
    e.preventDefault();

    $.ajax({
        method: 'GET',
        url: sandboxUrl,
        beforeSend: function( xhr ) {
           xhr.setRequestHeader ('Authorization', 'Basic '+ btoa( 'apiuser' + ':' + 'PASSWORD' ));
        },
        success: function(data){
            console.log(data);
            alert('Comentariul tău a fost adăugat cu succes');
        },
        error: function(data){
            console.log(data);
            alert('A apărut o eroare la adăugarea comentariului');
        }
    });

    return false;
});

Cum pot rezolva această problemă?

5
Comentarii

Ai încercat contentType: 'application/json'?

fuxia fuxia
24 oct. 2015 00:57:16

contentType poate fi application/json, cum a spus toscho, sau application/x-www-form-urlencoded. Ambele ar trebui să funcționeze dar json nu este o valoare validă pentru contentType.

cybmeta cybmeta
24 oct. 2015 08:11:56

Mulțumesc pentru comentarii, niciunul dintre aceste contentType-uri nu a rezolvat problema, dar vă mulțumesc pentru ajutor în evitarea altor probleme. Voi actualiza postarea originală.

TJ Sherrill TJ Sherrill
24 oct. 2015 17:33:52

Ai încercat Postman sau Rest Client pentru a delimita problema? Asigură-te că browserul folosit nu este autentificat pe site-ul tău WordPress (folosește modul incognito sau similar). PS - cum transmiți parametrii folosind URL-ul sandbox pentru funcția get?

brianlmerritt brianlmerritt
27 oct. 2015 23:16:21

Am aceeași experiență și în Postman. POST eșuează dar GET funcționează. M-am asigurat că nu sunt autentificat, dar am creat un "apiuser" pentru a evita orice suprapunere. În cazul GET, deoarece doar solicit postări, nu există parametri, doar accesez URL-ul cu o cerere GET.

TJ Sherrill TJ Sherrill
28 oct. 2015 17:41:33
Toate răspunsurile la întrebare 1
4

Am întâlnit aceeași problemă.

...autentificarea Basic Auth recomandată...

Am descoperit că problema este în plugin-ul Basic Auth. Echipa WP-API recomandă utilizarea propriului lor plugin și această soluție funcționează pentru mine.

  1. Dezactivează toate plugin-urile de autentificare basic activate în panoul de administrare WordPress
  2. Pe mașina pe care rulează WordPress-ul tău, accesează folderul de plugin-uri
  3. Rulează

    git clone https://github.com/WP-API/Basic-Auth.git

  4. Accesează panoul de administrare WordPress, pagina de plugin-uri. JSON Basic Authentication ar trebui să apară în listă. Activează-l.

Acum crearea unei înregistrări prin cerere POST ar trebui să funcționeze.

11 nov. 2015 17:06:45
Comentarii

Mulțumesc pentru notă, ai încercat asta în ultimele zile? Am folosit plugin-ul lor BasicAuth, am văzut notița din documentație care spunea că trebuie să folosești al lor.

TJ Sherrill TJ Sherrill
12 nov. 2015 17:57:42

Am încercat asta ieri. POST a început să funcționeze corect odată ce am instalat și activat plugin-ul.

Kirill Feoktistov Kirill Feoktistov
12 nov. 2015 18:20:50

ultima întrebare, poți să împărtășești numerele de versiune ale plugin-urilor?

TJ Sherrill TJ Sherrill
13 nov. 2015 18:58:26

Sigur. 'JSON Basic Authentication' - versiunea 0.1 de către WordPress API Team. 'WP REST API' versiunea 1.2.4 de WP REST API Team (de asemenea, am încercat versiunea 2.0-beta6, autentificarea a funcționat corect cu ea). WordPress v 4.3.1. Nu ezita să pui orice întrebări.

Kirill Feoktistov Kirill Feoktistov
13 nov. 2015 19:05:32