web-dev-qa-db-fra.com

Comment se connecter au site WordPress en utilisant les en-têtes HTTP d'authentification de base?

Je souhaite exécuter certains de mes tests d'acceptation automatisés en tant qu'utilisateur connecté. Mes tests d'acceptation sont exécutés à l'aide de Ghost Inspector, qui peut envoyer des en-têtes d'authentification de base.

Il existe un plug-in d'authentification de base pour l'API REST. Par conséquent, à moins que quelqu'un ne réponde à cette question avec une meilleure solution, je le piraterai pour qu'il fonctionne avec toutes les demandes.

Oui, l'authentification de base n'est pas super sécurisée, mais elle l'est autant que wp-login - IE c'est bien si vous utilisez HTTPS. En outre, ceci est un site de test, pas fou inquiet pour la sécurité.

2
JPollock

Je voudrais juste accrocher au filtre determine_current_user et vérifier les données d'authentification de base HTTP pour renvoyer l'utilisateur.

Peut-être que je n'autoriserais peut-être que des utilisateurs spécifiques à être connectés via HTTP.

Cela pourrait être fait, par exemple, en définissant une option utilisateur.

Le code pourrait ressembler à quelque chose comme ça (testé par OP):

add_filter( 'determine_current_user', function( $cur_user ) {

    // If user already logged in or no HTTP AUTH info, return
    if ($cur_user || empty($_SERVER['PHP_AUTH_USER']) || empty($_SERVER['PHP_AUTH_PW'])) {
        return $cur_user;
    }

    // If there's no user with given username, return
    $found_user = get_user_by('login', $_SERVER['PHP_AUTH_USER']);
    if (!$found_user) {
        return $cur_user;
    }

    // If password does not match, return
    if ( ! wp_check_password( $_SERVER['PHP_AUTH_PW'], $found_user->user_pass ) ) {
        return $cur_user;
    }

    // Return found user ID only if allowed to login via HTTP in user meta
    return get_user_option( 'http_auth_login_allowed', $found_user->ID )
        ? $found_user->ID
        : $cur_user;

}, 30);

J'ai utilisé la priorité 30, car WP utilise 20 (IIRC) pour déconnecter l'utilisateur du cookie. Il sera donc exécuté ultérieurement. Si cet utilisateur se trouve dans le cookie, cela ne fait rien.

Une vérification pour s'assurer que requst is_ssl() pourrait être ajoutée pour une meilleure sécurité, même si, en toute honnêteté, je ne l'utilisais pas sur un site de production. Mais étant donné que OP indique que la cible est un site de test ... cela devrait suffire.

3
gmazzap