wp_signon sempre passou a senha mesmo que a senha esteja errada

4

Estou testando para fazer login do usuário por meio de uma API do PHP, codifiquei os parâmetros no momento:

    $creds = array();
        $creds['user_login'] = 'foo';
        $creds['user_password'] = 'bar';

    $user = wp_signon( $creds, false );
    if ( is_wp_error($user) )
        echo $user->get_error_message();
    else
        echo 'login successfull';

O problema é que está testando a integridade do nome de usuário, mas não a senha, mesmo que a senha esteja errada, o login seja bem-sucedido, o que significa que a função de conexão não está funcionando como deveria. Estou incluindo o arquivo wp-config no topo do arquivo e testei a conexão wp DB antes de postar:

require_once ('../wp-config.php');

Estou faltando alguma coisa?

Atualização:

Estou depurando a variável $user : var_dump($user); e aqui está o que estou recebendo:

    login successfull object(WP_User)#304 (7) { ["data"]=> object(stdClass)#305
 (10) { ["ID"]=> string(2) "75" ["user_login"]=> string(5) "foo" ["user_pass"]=> 
string(34) "$P$B5uc93mdbK3R8QDOa0uC/fDnUu8rkP1" ["user_nicename"]=> string(5) 
"foo" ["user_email"]=> string(23) "foo.user@gmail.com" ["user_url"]=> string(0) ""
 ["user_registered"]=> string(19) "2014-05-15 17:52:45" ["user_activation_key"]=> 
string(0) "" ["user_status"]=> string(1) "0" ["display_name"]=> string(5) "foo" }
 ["ID"]=> int(75) ["caps"]=> array(1) { ["subscriber"]=> bool(true) } 
["cap_key"]=> string(15) "wp_capabilities" ["roles"]=> array(1) { [0]=> string(10)
 "subscriber" } ["allcaps"]=> array(3) { ["read"]=> bool(true) ["level_0"]=> 
bool(true) ["subscriber"]=> bool(true) } ["filter"]=> NULL }

Sempre que digito errado o nome de usuário, um erro é lançado, o que é bastante óbvio:

ERROR: Invalid username. Lost your password?ERROR: Invalid username. Lost your password?

Mas a senha sempre passou no teste, embora eu tenha certeza de que ela foi digitada incorretamente.

    
por Malloc 19.05.2014 / 00:17

1 resposta

1

A função wp_signon provavelmente está funcionando exatamente como deveria. O que está faltando é que existem outros métodos de autenticação, como os cookies do navegador, e o wp_signon também os verificará. Seu navegador está enviando seus cookies de autenticação do WordPress para o seu script?

O resultado é que você não deveria estar usando o wp_signon aqui, ou realisticamente, em qualquer lugar. Veja, a função wp_signon realiza toda a pilha de autenticação, não apenas uma simples verificação de nome de usuário e senha. As pessoas podem se autenticar de outras maneiras além de fornecer um nome de usuário e senha, e o wp_signon irá verificar todas elas, incluindo métodos adicionados por plugins e qualquer outra coisa que se conecte ao filtro de autenticação.

A função wp_signon é destinada a autenticar o próprio WordPress, não o seu script. Você está usando a função errada para o seu propósito.

Se você quiser apenas verificar um nome de usuário e senha, use a função wp_authenticate_username_password .

Basicamente, toda a noção de "entrar em um usuário" não faz sentido em um ponto de vista de script PHP. Você pode verificar as credenciais de um usuário e simplesmente usar wp_set_current_user para se tornar esse usuário, mas o código pode ser realmente qualquer usuário que ele queira ser. Você pode chamar wp_set_current_user para "se tornar" qualquer usuário, sem nenhuma credencial. Um script PHP personalizado tem acesso total para começar.

Então, realmente, nunca há necessidade de chamar wp_signon a menos que você queira autenticar e então b) enviar de volta cookies de autenticação para o navegador do usuário. Se você não estiver falando ativamente com o navegador do usuário para autenticar esse navegador no WordPress via cookies, então você não precisa estar fazendo wp_signon , nunca.

Se você precisar verificar as credenciais de um usuário em algum outro lugar, existem várias funções para fazer isso. Você pode verificar essas credenciais usando qualquer meio que desejar e, em seguida, wp_set_current_user para se tornar esse usuário apenas para essa sessão específica. Se você quiser registrá-las em uma base mais permanente, isso também é possível enviando cookies de autenticação, mas você provavelmente desejaria fazer isso mais diretamente, não através do wp_signon. E mesmo assim, se é isso que você está fazendo, uma abordagem bem mais simples seria simplesmente criar uma nova função de autenticação que retorne um WP_User válido com base na sua verificação e conecte-a ao filtro de autenticação. Em seguida, seu código personalizado para autenticação se torna muito mais simples.

Então, defina o que você está fazendo. Então as pessoas podem te dar a melhor maneira de fazer isso. Essa melhor maneira nunca vai envolver chamar você de wp_signon, nunca. :)

    
por Otto 19.05.2014 / 10:24

Tags