WordPress Auth + Nonces + Ajax + No Templating – Cookie-Nonce ist ungültig

Lesezeit: 3 Minuten

Ich verstehe den Prozess der Verwendung von Nonces, wenn ich meine eigenen Vorlagen erstelle. Aber ich entwickle eine ReactJS-App, die NUR die WordPress-REST-API zum Abrufen von Daten verwendet, sodass der Benutzer nie zur index.php gelangt, sondern Ajax-Aufrufe an die WP-Rest-API ausführt.

Jetzt kann ich das Nonce-Zeug nicht zum Laufen bringen. Das habe ich bisher gemacht:

Ich habe die folgenden Endpunkte hinzugefügt:

register_rest_route('frontend', '/customer/', array(
    'methods' => 'GET',
    'callback' => 'get_customer'
));

register_rest_route('frontend', '/customer/', array(
    'methods' => 'POST',
    'callback' => 'create_user_and_login'
));

Das sind meine Funktionen:

function get_customer()
{
    return get_current_user_id();
}


function create_user_and_login(){
    // dummy data for testing
    $credentials = ['user_login' => '[email protected]', 'user_password' => 'XXXX', 'remember' => true];

    // create a new user/customer via woocommerce
    $customerId = wc_create_new_customer($credentials['user_login'], $credentials['user_login'], $credentials['user_password']);
    if(is_a($customerId,'WP_Error')) {
        return $customerId;
    }
    // get the user & log in
    $user = get_user_by( 'id', $customerId );
    if( $user ) {
        wp_set_current_user( $customerId);
        wp_set_auth_cookie( $customerId );
    }
    // create new nonce and return it
    $my_nonce = wp_create_nonce('wp_rest');
    return $my_nonce;
}

Wenn ich jetzt einen POST dazu laufen lasse /customer was auslöst create_user_and_login(), wird die neu erstellte Nonce in der Ajax-Antwort zurückgegeben. Dann verwende ich die zurückgegebene Nonce, um meine nächste Anfrage auszuführen, ein GET to /customer?_wpnonce=MY-NONCEaber ich bekomme den Fehler:

{
    "code": "rest_cookie_invalid_nonce",
    "message": "Cookie nonce is invalid",
    "data": {
        "status": 403
    }
}

Ich überprüfte die Nonce-Dokumentation aber ich konnte keine Lösung für mein Problem finden. Kann es sein, dass die Sitzungen nicht synchron sind? Damit die Nonce auf der falschen Session erstellt wird bzw wp_set_auth_cookie und wp_set_current_user werden nicht richtig aufgerufen? Oder muss ich die verwenden wp_localize_script Funktion? Dies wird problematisch, da ich das ReactJS- und das WordPress-Backend getrennt haben möchte.

Ich habe nach dem POST zwei Kekse bekommen, a wordpress Keks und ein wordpress_logged_in Plätzchen.

Was vermisse ich?

Überprüfen Sie diese Antwort

Es scheint, dass, wenn Sie anrufen $my_nonce = wp_create_nonce('wp_rest'); Die Nonce wird mit dem alten Sitzungscookie erstellt, auch wenn Sie anrufen wp_set_auth_cookie und wp_set_current_user. Aber in der nächsten Anfrage wird die Sitzung aktualisiert, was bedeutet, dass die Nonce falsch ist.

Fügen Sie wie in der Antwort den folgenden Hook hinzu (z. B. functions.php), um eine Aktualisierung des Cookies zu erzwingen:

        function my_update_cookie( $logged_in_cookie ){
            $_COOKIE[LOGGED_IN_COOKIE] = $logged_in_cookie;
        }
        add_action( 'set_logged_in_cookie', 'my_update_cookie' );

  • Hallo, ich habe dieselbe Methode hinzugefügt und möchte die WordPress-Anmeldung mit Ajax von einer anderen Site durchführen. Aber Cookies sind immer noch nicht festgelegt Welche Aktion aufgerufen werden soll, um Cookies zu aktualisieren. Ich verwende Curl, um die WordPress-Vorlagendatei aufzurufen und versuche, mich anzumelden

    – Pratiksha Raikundaliya

    17. Dezember 2020 um 6:15 Uhr


  • Das klingt eher nach einem Cross-Site-Cookie-Problem. Weitere Informationen zu Cross-Site-Cookies finden Sie unter http://stackoverflow.com/questions/3342140/cross-domain-cookies

    – Felix Hagspiel

    17. Dezember 2020 um 18:22 Uhr

1382130cookie-checkWordPress Auth + Nonces + Ajax + No Templating – Cookie-Nonce ist ungültig

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy