Come utilizzare l'API REST di WordPress per il login di un utente?

25 set 2021, 02:37:55
Visualizzazioni: 16.3K
Voti: 2

Vorrei utilizzare l'API REST per ricevere username e password da una richiesta e usarli in wp_authenticate() per poi restituire se le credenziali erano corrette. Come posso farlo.

3
Commenti

Puoi creare un endpoint personalizzato, poi nella tua richiesta API, includi username e password, quindi chiama wp_authenticate() nel tuo endpoint per validare le credenziali. Ma la connessione dovrebbe sempre utilizzare https (protocollo sicuro) perché invieresti la password in testo semplice. E hai effettivamente provato del codice, letto tutorial/articoli?

Sally CJ Sally CJ
25 set 2021 04:47:39

@SallyCJ Quale metodo dovrei usare per inviare i dati? Inoltre, come sarebbe la funzione?

jeffinter jeffinter
25 set 2021 06:57:36

L'API può essere utilizzata da qualsiasi applicazione (JS, PHP, cURL, Postman, Python, ecc.) inviando semplici richieste HTTP. Ad esempio, sul front-end (o lato non admin) di un sito WordPress, puoi usare il client Backbone.js o wp.apiFetch().

Sally CJ Sally CJ
25 set 2021 07:50:40
Tutte le risposte alla domanda 4
0

Aggiungi il codice a functions.php E invia i dati alla route

add_action( 'rest_api_init', 'register_api_hooks' );
// Endpoint API personalizzati per WP-REST API
function register_api_hooks() {

    register_rest_route(
        'custom-plugin', '/login/',
        array(
            'methods'  => 'POST',
            'callback' => 'login',
        )
    );
}
    function login() {
        // La tua logica va qui.
        return wp_signon( array(
    'user_login'    => $_POST['user_login'],
    'user_password' => $_POST['user_password'],
    'remember'      => $_POST['remember']
), false );

    }
10 gen 2024 13:44:47
0

Ci sono 3 modi per autenticare un utente utilizzando una richiesta a un endpoint API REST:

1- Utilizzando i cookie, che è il modo in cui WordPress tiene traccia degli utenti autenticati nelle richieste POST. Passi i dettagli di autenticazione nella tua richiesta REST, usi la wp_signon() funzione per effettuare l'accesso dell'utente e, se ha successo, imposti il cookie di autenticazione utilizzando la funzione wp_set_auth_cookie() funzione,

$creds = array(
    'user_login'    => 'example',
    'user_password' => 'plaintextpw',
    'remember'      => true
);

$user = wp_signon( $creds, false );

if ( is_wp_error( $user ) ) {
    $msg = $user->get_error_message();
}else{
  wp_clear_auth_cookie();
  wp_set_current_user ( $user->ID ); // Imposta i dettagli dell'utente corrente
  wp_set_auth_cookie  ( $user->ID ); // Imposta i dettagli di autenticazione nel cookie
  $msg = "Accesso effettuato con successo"; 
}

Puoi trovare una discussione su questo thread del forum WordPress.

2- Utilizzando richieste di autenticazione Basic al tuo server

L'idea qui è che per ogni richiesta REST che invii al tuo server, passi le credenziali dell'utente (ogni volta) su una connessione SSL. Il gruppo API di WordPress fornisce un plugin sul loro repository GitHub per farlo al posto tuo, che ti permette di codificare le credenziali dell'utente e decodificarle dall'altra parte per autenticarlo. Ad esempio, per eliminare un post dell'utente sul server,

let user='...', pw='...';
jQuery.ajax({
   url: 'http://your-domain/wp-json/wp/v2/posts/50',
   method: 'DELETE',
   crossDomain: true,
   beforeSend: function ( xhr ) {
       xhr.setRequestHeader( 'Authorization', 'Basic ' + Base64.encode( user + ':' + pw ) );
   },
   success: function( data, txtStatus, xhr ) {
       console.log( data );
       console.log( xhr.status );
   }
});

Per maggiori dettagli, consulta questo tutorial approfondito.

3- Utilizzando un'autenticazione di terze parti come OAuth open.

Questo è ciò che utilizza Google e permette al tuo sito di identificare gli utenti in base alle loro credenziali di accesso Google. Anche WordPress.com utilizza questo metodo per l'autenticazione del suo servizio di blog.

L'idea è che i tuoi utenti accedano a un server che li identifica (utilizzando i cookie sul loro browser).

Una volta autenticati, la tua pagina (js reattivo) effettua una richiesta all'autorità/server di autenticazione che, se confermata dall'utente, restituisce un token di accesso utilizzato per autenticare le richieste REST successive.

Potresti utilizzare un servizio di autenticazione di terze parti, come Google, nel qual caso puoi seguire questo tutorial su YouTube che ti guida attraverso le basi per impostare un progetto API Google per permettere alla tua applicazione di effettuare richieste di autenticazione.

In alternativa, potresti convertire il tuo server WordPress in un server OAuth utilizzando un plugin esistente come WP-OAuth Server, e la sua ampia documentazione.

25 set 2021 14:40:30
3

Il modo migliore per "fare il login" di un utente su un sito è utilizzare il modulo di login di WordPress. Come suggeriscono altri commenti e risposte, farlo nel modo implicito dal titolo della domanda richiederebbe reinventare la ruota. Il modulo di login, oltre a effettuare l'effettivo accesso, fornisce feedback quando il login fallisce e offre un flusso per reimpostare la password.

Anche se stai puntando a un'esperienza WordPress completamente "headless", dovresti essere sicuro al 100% che lo sforzo di reinventare il modulo di login ne valga la pena.

Ora, se intendi autenticare l'utente da un dominio diverso, semplicemente non funzionerà poiché i cookie verranno impostati solo sul dominio del sito, se non ricordo male.

Quindi l'unico caso d'uso valido è la comunicazione server-to-server in cui è necessario memorizzare i cookie ricevuti dalla richiesta di "login" e riutilizzarli nelle richieste successive, ma ciò implica che memorizzi nome utente e password sul tuo server, nel qual caso utilizzare password applicative potrebbe essere effettivamente una soluzione migliore.

25 set 2021 15:42:06
Commenti

Non risponde alla domanda.

Aurovrata Aurovrata
28 dic 2022 07:13:38

alle domande mal poste si ottengono risposte non ottimali. A posteriori, probabilmente l'OP vuole sapere se un utente è loggato, ma inviare una richiesta REST solo per questo difficilmente sarà il modo migliore per farlo.

Mark Kaplun Mark Kaplun
28 dic 2022 15:20:34

a meno che non sia cross-domain, nel qual caso si aprirebbe un vaso di Pandora di problemi se si implementasse qualcosa del genere

Mark Kaplun Mark Kaplun
28 dic 2022 15:45:05
0

Le password dell'applicazione WordPress (introdotte in WordPress 5.6) consentono l'accesso all'API tramite autenticazione HTTP Basic. Utilizzi il tuo nome utente WordPress e una password dell'applicazione generata (trovata nel tuo profilo utente) per autenticare le richieste.

Passaggi Esatti

Accedi all'Admin di WordPress: Accedi alla dashboard di amministrazione di WordPress (es. https://tuo-sito-wordpress.com/wp-admin).

Vai al Tuo Profilo: Nel menu a sinistra, clicca su Utenti e poi su Profilo (o Il Tuo Profilo).

Trova la Sezione Password dell'Applicazione: Scorri verso il basso fino a vedere la sezione Password dell'Applicazione.

Genera una Nuova Password dell'Applicazione: Inserisci un nome descrittivo per la nuova applicazione (es. "App Python"). Clicca sul pulsante Aggiungi Nuova Password dell'Applicazione. Importante: Copia immediatamente la password generata, poiché non verrà mostrata di nuovo.

Utilizza le Credenziali per le Richieste API: Combina il tuo nome utente WordPress e la password dell'applicazione generata per autenticarti tramite HTTP Basic Authentication. La libreria requests codificherà automaticamente queste credenziali in Base64 con HTTPBasicAuth.

Esempio di codice Python:

import requests
from requests.auth import HTTPBasicAuth

# Sostituisci con l'URL del tuo sito WordPress, nome utente e password dell'applicazione generata
site_url = "https://tuo-sito-wordpress.com"
username = "tuo_nome_utente"
app_password = "tua_password_applicazione"

# Esempio: GET dei post
get_url = f"{site_url}/wp-json/wp/v2/posts"
response = requests.get(get_url, auth=HTTPBasicAuth(username, app_password))
print("Risposta GET:", response.json())

# Esempio: POST di un nuovo post con dati
post_url = f"{site_url}/wp-json/wp/v2/posts"
data = {
    "title": "Hello World",
    "content": "Questo post è stato creato via REST API con una password dell'applicazione.",
    "status": "publish"
}
response = requests.post(post_url, json=data, auth=HTTPBasicAuth(username, app_password))
print("Risposta POST:", response.json())
5 mar 2025 16:50:31