WP-API e Basic Auth restituiscono 403 su POST ma non su GET

24 ott 2015, 00:47:15
Visualizzazioni: 14.1K
Voti: 2

Sto utilizzando l'ultima versione di WP-API e il metodo Basic Auth raccomandato per testare l'aggiunta di un post a WordPress da remoto.

Ho configurato gli header di accesso lato WordPress:

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

Quando invio una richiesta GET a: http://sandbox.ravennainteractive.com/wp-json/wp/v2/posts l'autenticazione funziona e restituisce il post "Hello World".

Quando invio una richiesta POST allo stesso URL, ottengo un errore. Ecco la mia chiamata AJAX con 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('Il tuo commento è stato aggiunto con successo');
        },
        error: function(data){
            console.log(data);
            alert('Si è verificato un errore durante l\'aggiunta del tuo commento');
        }
    });

    return false;
});

La risposta è: Failed to load resource: the server responded with a status of 403 (Forbidden)

Array[0]responseText: "[{"code":"rest_forbidden","message":"You don't have permission to do this.","data":{"status":403}}]"

Se eseguo questo blocco di codice semplificato, rimuovendo gli elementi non necessari, la query funziona e restituisce il post "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('Il tuo commento è stato aggiunto con successo');
        },
        error: function(data){
            console.log(data);
            alert('Si è verificato un errore durante l\'aggiunta del tuo commento');
        }
    });

    return false;
});

Come posso risolvere questo problema?

5
Commenti

Hai provato con contentType: 'application/json'?

fuxia fuxia
24 ott 2015 00:57:16

contentType può essere application/json, come ha detto toscho, oppure application/x-www-form-urlencoded. Entrambi dovrebbero funzionare ma json non è un valore valido per contentType.

cybmeta cybmeta
24 ott 2015 08:11:56

Grazie per i commenti, nessuno di quei contentType ha risolto il problema ma grazie per avermi aiutato a evitare altri problemi. Aggiornerò il post originale.

TJ Sherrill TJ Sherrill
24 ott 2015 17:33:52

Hai provato Postman o Rest Client per individuare il problema? Assicurati che il browser che lo esegue non sia collegato al tuo sito WordPress (usa la modalità incognito o simile). PS - come stai inviando i parametri usando l'URL sandbox per la funzione get?

brianlmerritt brianlmerritt
27 ott 2015 23:16:21

Ho la stessa esperienza in Postman. Il POST fallisce ma il GET funziona. Mi sono assicurato di essere disconnesso creando un "apiuser" in modo che non ci sia mai sovrapposizione. Nel caso del GET, visto che sto solo chiedendo i post, non ci sono parametri, sto solo pingando l'URL con un GET.

TJ Sherrill TJ Sherrill
28 ott 2015 17:41:33
Tutte le risposte alla domanda 1
4

Ho riscontrato lo stesso problema.

...l'autenticazione Basic Auth consigliata...

Ho scoperto che il problema è nel plugin Basic Auth. I ragazzi di WP-API consigliano di utilizzare il loro plugin e questa soluzione ha funzionato per me.

  1. Disattiva tutti i plugin di autenticazione basic attivati nella dashboard di WordPress
  2. Sul computer dove è installato WordPress, vai alla cartella dei plugin
  3. Esegui

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

  4. Vai alla dashboard di amministrazione di WordPress, nella pagina dei plugin. JSON Basic Authentication dovrebbe essere nella lista. Attivalo.

Ora la creazione di un record tramite richiesta POST dovrebbe funzionare.

11 nov 2015 17:06:45
Commenti

Grazie per la nota, hai provato questo negli ultimi giorni? Stavo usando il loro plugin BasicAuth, ho visto la nota nella documentazione che diceva di dover usare il loro.

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

L'ho provato ieri. POST ha iniziato a funzionare correttamente una volta installato e attivato il plugin.

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

ultima domanda, puoi condividere i numeri di versione del plugin?

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

Certo. 'JSON Basic Authentication' - versione 0.1 del team WordPress API. 'WP REST API' versione 1.2.4 del team WP REST API (ho anche provato la versione 2.0-beta6, l'autenticazione ha funzionato correttamente con essa). WordPress v 4.3.1. Sentiti libero di fare qualsiasi domanda.

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