web-dev-qa-db-fra.com

Comment vérifier le nom d'utilisateur/mot de passe sans se connecter à l'utilisateur

J'écris un plugin qui crée un point de terminaison API qui valide les paires nom d'utilisateur/mot de passe.

J'utilise actuellement wp_signon() pour vérifier si la combinaison nom d'utilisateur/mot de passe fonctionne. Cela fonctionne correctement lorsque les informations d'identification échouent, car elles renvoient un objet d'erreur. Toutefois, lorsque les informations d'identification sont correctes, il est automatiquement connecté à cet utilisateur. Mon noeud final renvoie donc une page entière.

Le codex ne mentionne même pas le fait qu'il se connecte automatiquement à l'utilisateur. De plus, il ne semble pas accepter un paramètre pour supprimer cette fonctionnalité. Pour mes besoins, un simple booléen serait bien.

UPDATE: Je devais choisir une seule réponse, mais il y avait beaucoup d'informations utiles sur plusieurs autres réponses que je vais essayer de résumer brièvement ici ...

  1. Voici IS une fonction qui remplit exactement ce que j’essayais de faire: wp_authenticate($username, $password) TOUTEFOIS, elle présente un inconvénient. Il définira automatiquement les cookies de connexion qui peuvent créer des problèmes dans une situation comme la mienne. Donc sois prudent. Cette fonction ne figure pas actuellement dans le codex.

  2. Le meilleur choix pour ce que je fais est wp_authenticate_username_password($user, $username, $password) car il ne définit PAS les cookies de connexion. Cette fonction est plus documentée, mais le détail VRAIMENT important qui ne figurait pas dans le codex est que vous pouvez passer NULL en tant que premier paramètre. Cela signifie que vous pouvez l'utiliser efficacement pour faire exactement le même chose que wp_authenticate() sans vous soucier des cookies se foirés. Lisez la documentation pour ne pas être dérouté par la réponse. Il retourne soit un objet WP_User, soit un WP_Error (pas un boolean!).

4
emersonthis

Il existe une fonction dans le fichier user.php des fichiers de base appelée wp_authenticate_username_password qui semble correspondre à ce que vous recherchez.

Si vous voulez éviter de lancer l'objet $user (vous n'avez probablement que le nom d'utilisateur + mot de passe), lancez simplement null en tant que 1er argument de fonction dans:

$check = wp_authenticate_username_password( NULL, 'some_username', '#thepassw0rd' );

Vous pouvez alors simplement vérifier le résultat avec is_wp_error( $check ).

6
fdsa

Utilisation,

et

Explication

// get user by login via the supplied username (form input)
$user = get_user_by('login', $username);

//assign user ID based on user login name
$user_id = $user->ID;

// get user data by passing the assigned $user_id variable to get_userdata
// which returns the user object and a Host of user related info to access
$user_data = get_userdata($user_id);


// assign the username and password to variables
$user_login = $user_data->user_login;
$user_pass = $user_data->user_pass;

// check the username/password against the submitted input values
if ($user_login = $username && $user_pass = $password) {

// do something...

Remarques

  • $username doit valider true par défaut, sinon un objet utilisateur n'aurait pas été renvoyé si le $username fourni ne correspond pas à un objet existant dans la base de données. Par conséquent, la validation repose ensuite sur la variable $password qui stocke l'entrée de formulaire fournie par l'utilisateur.

  • Il existe peut-être un moyen plus efficace d'y parvenir, soit en raccourcissant le code existant, soit en utilisant d'autres fonctions de l'API.

METTRE À JOUR

Selon la suggestion de fdsa , vous pouvez à votre tour utiliser wp_authenticate_username_password de cette manière,

$auth = wp_authenticate_username_password($user, $username, $password);

if (!$auth->user_login = $username && !$auth->user_pass = $password) {

echo 'not authenticated';

} else {

echo 'authenticated';

}

Mais même mieux que ça,

$auth = wp_authenticate_username_password($user, $username, $password);

if (is_wp_error($auth)) {

echo 'not authenticated';

} else {

echo 'authenticated';

}

En réalité, le crédit/la réponse marquée doit être attribué à fdsa pour la méthode la plus efficace au moyen (malheureusement) de la fonction principale WP.

http://wpseek.com/wp_authenticate_username_password/

1
userabuser

Avertissement: cette réponse doit simplement montrer ce qui se passe dans les coulisses et ne doit pas être un exemple concret de la façon de faire les choses.


La trace

wp_signon() appelle wp_set_auth_cookie() , qui appelle ensuite wp_generate_auth_cookie() . Le résultat sera utilisé dans setcookie() en tant que 2dakota du Nord argument.

(Non performant) amusant avec des filtres

tromper WordPress dans le mauvais sens.

Vous pouvez alors simplement sauter dans le filtre 'auth_cookie'- dans wp_generate_auth_cookie() et le définir simplement à null ou à quelque chose d'autre que la valeur SECURE_AUTH_COOKIE ou AUTH_COOKIE. Cela vous laissera alors avec un cookie insensé, qui ne peut pas se connecter.

1
kaiser

"Ta-da": wp_authenticate($username, $password)

Ce n'est pas du tout dans le codex, mais vous pouvez le rechercher sur wpseek .

Cela fait exactement ce que cela ressemble. Prend un nom d'utilisateur et un mot de passe en texte brut et retourne un objet WP_User ou un WP_Error... et ne connecte personne à.

Une note de prudence! Ce qui suit retournera TOUJOURS la valeur true (car la fonction renvoie un objet dans les deux sens):

$auth = ( wp_authenticate($username, $password) ) ? TRUE : FALSE;

Vous voudrez probablement faire quelque chose comme ceci:

$test_creds = wp_authenticate($username, $pass) ;
$class = get_class($test_creds);
$auth = ( $class == 'WP_User' ) ? TRUE : FALSE ;

J'espère que ça aidera quelqu'un.

0
emersonthis