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-NONCE
aber 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?