Como posso ter certeza de que um usuário confirmou seu email após o registro?

8

Estou trabalhando em um plug-in que usa o WordPress como o provedor de Conexão Única para outro aplicativo. Preciso ter certeza de que o usuário confirmou o endereço de e-mail respondendo ao e-mail enviado por wp_new_user_notification() .

Até agora, a melhor abordagem que encontrei é conectar-se à ação after_password_reset e adicionar user_metadata para indicar que o email foi verificado. Isso funciona, mas tudo o que realmente está me dizendo é que a função reset_password foi chamada.

Existe uma maneira melhor de fazer isso?

    
por Simon Cossar 09.07.2016 / 03:22

2 respostas

3

Eu tentei algumas abordagens diferentes para verificar o email do usuário. Por enquanto, o que estou fazendo é isto:

Quando um usuário se registra pela primeira vez, defina o user_metadata do usuário 'email_not_verified' como 1.

add_action( 'user_register', 'sc_user_email_not_verified' );
function sc_user_email_not_verified( $user_id ) {
  update_user_meta( $user_id, 'email_not_verified', 1 );
}

Em seguida, substitua a função wp_new_user_notification para que adicione uma 'email_verification_key' à URL de login. Também salva essa chave como user_metadata.

function wp_new_user_notification( $user_id, $depreciated = null, $notify = '' ) {

...

$email_verification_key = wp_generate_password( 20, false );
update_user_meta( $user_id, 'email_verification_key', $email_verification_key );

$message = sprintf(__('Username: %s'), $user->user_login) . "\r\n\r\n";
$message .= __('To set your password, visit the following address:') . "\r\n\r\n";
$message .= '<' . network_site_url("wp-login.php?action=rp&key=$key&mail_key=$email_verification_key&login=" . rawurlencode($user->user_login), 'login') . ">\r\n\r\n";
$message .= wp_login_url() . "\r\n";

wp_mail($user->user_email, sprintf(__('[%s] Your username and password info'), $blogname), $message);
}

Em seguida, conecte-se à ação 'validate_password_reset' para verificar se a chave de verificação de e-mail da solicitação de redefinição de senha corresponde à chave salva. Se as chaves não corresponderem, exclua o usuário e redirecione-o de volta ao formulário de registro com um erro "emailnotverified". Se as chaves coincidirem, exclua os metadados "email_not_verified".

add_action( 'validate_password_reset', 'sc_verify_user_email', 10, 2 );
function sc_verify_user_email( $errors, $user ) {
    if ( isset( $_REQUEST['mail_key'] ) ) {
        $email_verification_key = $_REQUEST['mail_key'];
        $saved_key              = get_user_meta( $user->ID, 'email_verification_key', true );

        if ( ! ( $email_verification_key === $saved_key ) ) {
            require_once( ABSPATH . 'wp-admin/includes/user.php' );
            wp_delete_user( $user->ID );
            wp_redirect( network_site_url( "wp-login.php?action=register&error=emailnotverified" ) );
            exit;
        } else {
            delete_user_meta( $user->ID, 'email_not_verified' );
        }
    }
}

Se o e-mail não for confirmado, adicione uma mensagem que será exibida na página de registro quando houver um erro "emailnotverified".

add_filter( 'login_message', 'sc_email_not_verified_message' );
function sc_email_not_verified_message() {
    $action = isset( $_REQUEST['action'] ) ? $_REQUEST['action'] : '';
    $error = isset( $_REQUEST['error'] ) ? $_REQUEST['error'] : '';

    if ( 'register' === $action && 'emailnotverified' === $error ) {
        $message = '<p class="message">' . __( 'Your email address could not be verified. Please try registering again.' ) . '</p>';
        return $message;
    }
}

Dentro da função Single Sign On, se o usuário tiver os metadados 'email_not_verified', não os registre no aplicativo cliente. (Isso pode acontecer se o usuário tiver sido criado por meio de um formulário de registro que foi adicionado por um plug-in).

$current_user = wp_get_current_user();
if ( get_user_meta( $current_user->ID, 'email_not_verified', true ) ) {
    echo( 'Invalid request.' ); // This needs to be changed to a redirect.
    exit;
}

Também adicionei uma caixa de seleção para exibir e substituir o status de verificação de e-mail do usuário na página "edição do usuário".

Editar:

Conectar-se à ação validate_password_reset provavelmente não é a melhor maneira de fazer isso. Ele é chamado antes que a senha seja redefinida, portanto, o email será verificado mesmo se houver erros no processo de redefinição de senha (por exemplo, se a chave expirou ou é inválida).

Uma abordagem melhor parece ser ligar-se à ação resetpass_form e adicionar um campo oculto ao formulário de redefinição de senha que contém o valor de 'mail_key':

add_action( 'resetpass_form' 'sc_mail_key_field' );
function sc_mail_key_field() {

    if ( isset( $_REQUEST['mail_key'] ) ) { 

        $mail_key = sanitize_key( wp_unslash( $_REQUEST['mail_key'] ) );
        wp_nonce_field( 'verify_email', 'verify_email_nonce' );
        echo '<input type="hidden" name="mail_key" value="' . esc_attr( $mail_key ) . '" />';
    }
}

É possível, então, conectar-se à ação after_password_reset para verificar a chave de e-mail salva em relação ao valor $_POST['mail_key'] .

Um exemplo de plug-in pode ser encontrado aqui: plug-in de verificação de endereço de e-mail

    
por Simon Cossar 11.07.2016 / 04:40
2

Eu dei uma olhada na tabela wp_usermeta e observei a chave meta default_password_nag .

Eu verifiquei e isso foi introduzido em # 9710 cerca de 7 anos atrás.

Se o usuário tiver uma senha gerada automaticamente , seu valor será 1 e ela receberá um aviso exibido na tela do painel.

Quando ela se registra pela primeira vez, default_password_nag é 1 e quando ela redefine a senha, seguindo o link de e-mail, ela se torna 0.

Você pode pesquisar mais sobre isso, se puder ser de alguma utilidade em sua configuração.

Caso contrário, pode-se criar um contador personalizado ou um sinalizador e armazená-lo no meta do usuário . Por exemplo. conectar-se ao processo de criação do usuário e atualizá-lo quando o usuário redefinir a senha ou efetuar login.

    
por birgire 09.07.2016 / 13:09