Pregunta sobre Developing with WordPress de Wordpress:

Inicio de sesi贸n de Ajax y verificaci贸n de nonce

Un usuario pregunt贸 馃憞

Hola a todos,

Quiero lograr lo siguiente:

1. Tengo un formulario 芦X禄 personalizado que requiere un inicio de sesi贸n para enviarlo. 2. Tambi茅n tengo un formulario de inicio de sesi贸n ajax.

Flujo de trabajo –
1. Cuando un usuario que no ha iniciado sesi贸n ingresa al formulario personalizado 芦X禄, llena el formulario y cuando quiere enviarlo, se abre el inicio de sesi贸n ajax y el usuario inicia sesi贸n a trav茅s del registro del formulario que ajax. Luego pueden ingresar el formulario 芦X禄.

Asunto –
Estoy usando un nonce para el formulario 芦X禄 que genera un valor nonce para los usuarios que no han iniciado sesi贸n. Pero una vez que se realiza el inicio de sesi贸n de ajax, es necesario actualizar el valor de nonce. Estoy generando un nuevo nonce despu茅s de iniciar sesi贸n. Pero ese nonce tampoco funciona y la forma 芦X禄 no se puede verificar.

C贸digo de formulario 芦X禄 –


<form name="x" action="<?php echo esc_url( admin_url('admin-post.php') ); ?>" method="post">
      <label for="checkbox_one"><?php echo esc_html__("Checkbox Name", "text-domain"); ?></label>
      <input type="checkbox" name="checkbox_one" id="checkbox_one" >
      <input type="hidden" name="action" value="my_action">
      <?php wp_nonce_field( "action_name", "nonce_name" ); ?>
      <input type="submit" value="Submit">
</form>
<a href="#"><?php echo esc_html__("Click me to login first. An ajax login modal will open.", "text-domain"); ?></a>

C贸digo de manejo de env铆o de inicio de sesi贸n de Ajax a trav茅s de admin-ajax.php


function login(){
        
        //bail early if found suspecious with nonce verification.
	if ( !isset( $this->values['_login_nonce'] ) || ! wp_verify_nonce( $this->values['_login_nonce'], 'ajax_login' ) ) {
        
            wp_send_json_error([
                'login'     => false,
                'message'   => esc_html__('Security check unsuccessful.','text-domain')
            ]);
        
        }

        if( isset($this->values['_username']) && isset($this->values['_password']) ){

            $creds = array(
                'user_login'    => sanitize_user($this->values['_username']),
                'user_password' => $this->values['_password'],
                'remember'      => true
            );
         
            $user = wp_signon( $creds, false );
         
            if ( is_wp_error( $user ) ) {
                wp_send_json_error([
                    'login'     => false,
                    'message'   => esc_html($user->get_error_message())
                ]);
            }else{
                wp_set_current_user($user->ID);
                wp_set_auth_cookie($user->ID);
                wp_send_json_success([
                    'login'     => true,
                    'message'   => esc_html__('Login Successful.', 'text-domain'),
                    'new_nonce' => wp_create_nonce('action_name'),
                ]);
            }
            
        }

        exit();
}

Ver谩, despu茅s de un inicio de sesi贸n exitoso a trav茅s del formulario ajax, estoy creando el nonce nuevamente con la misma acci贸n nonce en forma 芦X禄 wp_create_nonce('action_name') que tengo la intenci贸n de inyectar en el formulario 芦X禄 despu茅s de iniciar sesi贸n.

Desafortunadamente, este nonce no funciona cuando intento autenticar un env铆o de formulario 芦X禄 despu茅s de iniciar sesi贸n en ajax. Revis茅 el navegador y descubr铆 que el nonce es diferente. Agradecer茅 cualquier ayuda de la comunidad aqu铆.

隆Gracias!

(@ alegremente)

Hace 6 meses, 3 semanas

Deber铆a cambiar el flujo de trabajo. No muestre el formulario a menos que el usuario haya iniciado sesi贸n.

Lanzador de hilos

(@ amitbiswas06)

Hace 6 meses, 3 semanas

@con alegr铆a Gracias por la respuesta. Sin embargo, esta no es una soluci贸n de codificaci贸n. No creo que WordPress no pueda ofrecer soluciones para este tipo de situaci贸n. Espero una soluci贸n de codificaci贸n para esto, ya que no hay problemas con mi flujo de trabajo. Tengo que permitir que los usuarios completen el formulario ya sea que hayan iniciado sesi贸n o no.

(@ alegremente)

Hace 6 meses, 3 semanas

Piense en lo que es el nonce. Desea asegurarse de que la acci贸n no sea secuestrada y que el usuario tenga la intenci贸n de realizar la acci贸n en el objeto. Entonces, mientras genera el nonce, usa algo para conectar al usuario con la acci贸n. Bueno, al completar un formulario cuando no est谩 conectado, no puede conectar un usuario al objeto, porque no hay ning煤n usuario. 驴Significa eso que no deber铆a haber forma o forma? No tiene sentido poner un nonce en una forma que no se utilizar谩. El PHP debe poder calcular el mismo nonce para poder verificarlo. As铆 que es un punto intentar lanzar un nuevo nonce en AJAX. 驴C贸mo conocer铆a la funci贸n AJAX al usuario real o secuestrador? Necesitas cambiar el flujo.

Lanzador de hilos

(@ amitbiswas06)

Hace 6 meses, 3 semanas

@ alegremente no tiene sentido hablar de otra manera. Por ejemplo, s铆, se utilizar谩 el formulario nonce ya que hay dos opciones para enviarlo. Sin un usuario de inicio de sesi贸n y un usuario registrado, ambos pueden enviar el formulario. El usuario que no ha iniciado sesi贸n debe completar una identificaci贸n de correo electr贸nico para esto. Mi problema es que cuando un usuario registrado decide enviar el formulario para iniciar sesi贸n, tengo que permitirle que lo env铆e sin actualizar la p谩gina completa, lo que lo proteger谩 de ingresar todos los detalles en el formulario. 驴Espero que esto tenga sentido?

(@ alegremente)

Hace 6 meses, 3 semanas

Si el usuario que no inici贸 sesi贸n puede interrumpir, no incluya el enlace para el inicio de sesi贸n AJAX. Parece que necesita dos registros de actividad diferentes, uno con inicio de sesi贸n y otro sin inicio de sesi贸n, que completa con el _priv adem谩s del nombre del anzuelo.

Lanzador de hilos

(@ amitbiswas06)

Hace 6 meses, 3 semanas

@con alegr铆a parece que se est谩 perdiendo el punto del que estoy hablando. Ya estoy usando ambas pepitas para la forma 芦X禄. Todo lo que quer铆a hacer era crear el inicio de sesi贸n nonce y restaurarlo despu茅s del inicio de sesi贸n ajax. Que en este caso vuelve pero diferente. Si ves mi c贸digo debajo de esta l铆nea $user = wp_signon( $creds, false );, usted lo consigue.

Lanzador de hilos

(@ amitbiswas06)

Hace 6 meses, 3 semanas

Acabo de encontrar la soluci贸n aqu铆: fluir-fluir

El problema clave fue: despu茅s de que el inicio de sesi贸n de ajax fuera exitoso, el nonce se cre贸 con una cookie de sesi贸n antigua y la sesi贸n actualiza la siguiente solicitud. Entonces tengo el set_logged_in_cookie Gancho de acci贸n para actualizar la cookie de sesi贸n inmediatamente despu茅s del inicio de sesi贸n ajax. Aqu铆 est谩 el c贸digo:


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

Un tema similar se discuti贸 hace unos a帽os en este foro: la creaci贸n de un registro nonce Ajax

隆Gracias!

驴Solucion贸 tu problema??

0 / 0

Deja una respuesta 0

Tu direcci贸n de correo electr贸nico no ser谩 publicada. Los campos obligatorios est谩n marcados con *