web-dev-qa-db-fra.com

Traitement de la génération de nonce en AJAX processus d'inscription

Je travaille actuellement sur un système d'inscription en plusieurs étapes, basé sur la nouvelle API Wordpress Rest et j'ai un problème lié à la génération et à la vérification de nonce.

Ma première étape consiste à demander à l'utilisateur, à partir d'un formulaire frontal, les informations essentielles (nom - prénom - adresse électronique). La seconde consiste à lui demander des informations supplémentaires sur les métadonnées. Puis le troisième à lui demander son mot de passe et sa confirmation.

Il y a 3 requêtes HTTP Post différentes dans le processus, tout est géré en AJAX. La stratégie que j'ai appliquée consiste à générer un nonce côté serveur si le premier POST est correct et à le renvoyer dans la réponse JSON. Voici le code pour la création de l'utilisateur à la première étape:

 $user_id = wp_insert_user( $userdata ) ;          
 $user = new \WP_User($user_id);
 if (!empty( $user ) && $user instanceof \WP_User) {
    $user->add_role( 'subscriber' );
 }

 // Autologin after registration
 wp_set_current_user($user_id);
 wp_set_auth_cookie($user_id);

 // Storing the regitration event for the user
 $this->saveLoginEvent( $user_id );

 $data = array(
    'user_id' => $user_id,
    'nonce'   => wp_create_nonce( 'wp_rest' ),
    'message' => 'user_created'
 );

L'utilisateur est correctement créé et connecté. Cependant, l'utilisation de ce nonce lors des étapes supplémentaires est considérée comme non valide (obtenant toujours 403). Mon code pour veryfying the nonce est le suivant:

/**
 * authenticate_call - Default permission callback used to validate that the call is coming from our frontend
 *
 * @return {WP_nonce}  The state of the nonce, if it is verified or not
 */
public function authenticate_call() {

   if ( isset( $_REQUEST['_wpnonce'] ) ) {
       $nonce = $_REQUEST['_wpnonce'];
   } elseif ( isset( $_SERVER['HTTP_X_WP_NONCE'] ) ) {
       $nonce = $_SERVER['HTTP_X_WP_NONCE'];
   }

   if ( empty( $nonce ) || null === $nonce ) {
     // No nonce at all, so act as if it's an unauthenticated request.
     return new \WP_Error( 'rest_cookie_no_nonce', __( 'Nonce is invalid' ), array( 'status' => 403 ) );
   }

   $result = wp_verify_nonce( $nonce, 'wp_rest' );
   if ( ! $result ) {
    return new \WP_Error( 'rest_cookie_invalid_nonce', __( 'Cookie nonce is invalid' ), array( 'status' => 403 ) );
   }

   return true;
}

L'erreur que je reçois est la deuxième: rest_cookie_invalid_nonce. Le nonce est passé comme paramètre d'URL comme ceci POST www/api/url?_wpnonce=a30e88f0bd. Une idée ? Savez-vous s'il est impossible que le serveur génère le nonce et le renvoie au serveur? Devrais-je le générer sur le frontend en utilisant une méthode que je ne connais pas encore? Si cela peut aider, j'utilise Timber et Twig en tant que composants de l'architecture frontale.

Merci d'avance,

1
Balessan

Si quelqu'un y étrangle quelque chose, la solution appropriée consiste à utiliser les deux wp_set_auth_cookie en spécifiant le deuxième paramètre, le cookie log_in, ce qui me donne maintenant le code suivant:

wp_set_current_user($user_id);
if ( wp_validate_auth_cookie( '', 'logged_in' ) != $user_id )
{
    wp_set_auth_cookie( $user_id );
}

Et pour ajouter une action, comme suggéré dans ce fil de discussion: Étendez la session Wordpress (4.x) et le nonce pour que le cookie actuel connecté soit remplacé sans nécessiter d'actualisation de la page.

C’était une question délicate, certes, et sans papiers n’importe où. Est-ce que quelqu'un a déjà essayé?

Merci pour votre attention quand même,

1
Balessan