web-dev-qa-db-fra.com

Problème de connexion WP les utilisateurs automatiquement

À titre de mesure provisoire lors de la migration des utilisateurs vers un nouveau système, j’ai mis au point une solution qui permet à un utilisateur qui se connecte à l’ancien système de les transférer au nouveau système et de se connecter automatiquement à son nouveau compte en fonction de son ID utilisateur.

Le code sur l'ancien système ressemble à ceci:

function client_redirect_select_users($user_login, $user) {
  $user_id = $user->ID;
  $redirect_user = get_user_meta($user_id, 'client_redirect_user', true);
  if (intval($redirect_user) == 1) :
    $redirect_user_id = get_user_meta($user_id, 'client_redirect_user_id', true);
    /* Construct fancy string to obscure user id */
    wp_redirect('http://sillysite.com/?user_redirect='.$redirect_user_string);
    exit();
  endif;
}
add_action('wp_login', 'client_redirect_select_users', 10, 2);

Le code sur le nouveau système ressemble à ceci:

 function client_auto_login() {
  if (!is_user_logged_in()) :
    if (isset($_GET['user_redirect'])) :
      $user_login_string = intval($_GET['user_redirect']);
      /* Do some fancy stuff to extract user id from the GET string */
      $user_data = get_userdata($decrypted_user_id);
      if ($user_data) :
        $user_login = $user_data->user_login;
        wp_set_current_user($user_id, $user_login);
        wp_set_auth_cookie($user_id, true);
        do_action('wp_login', $user_login);
      endif;
    endif;
  endif;
}

add_action('init', 'client_auto_login');

L'utilisateur est connecté correctement et peut voir ses données. Mais lorsqu'ils cliquent sur un lien de la page, ils sont déconnectés à nouveau. Pourquoi? :( Existe-t-il un meilleur moyen de le faire? Je pourrais aussi envoyer le mot de passe de l'utilisateur de l'ancien système (avec un cryptage trivial) et utiliser wp_signon () à la place, mais je préfère ne pas le faire.

Aidez-moi?

(Je suis conscient à 110% qu'il ne s'agit pas d'une solution sécurisée AT ALL, mais il s'agit d'une mesure provisoire de quelques semaines pendant laquelle le nouveau système est opérationnel et les utilisateurs ne le sont pas. Nous n’essayons pas non plus de comprendre comment accéder à un compte en regardant simplement la chaîne de connexion de l’utilisateur ou même en fournissant un identifiant utilisateur aléatoire, bien que le mécanisme puisse être deviné avec quelques efforts).

2
Maija Vilkina

À la fin, wp_signon () était la solution, car le cookie n'était apparemment pas configuré avec le code que j'utilisais. J'ai suivi cette solution https://Gist.github.com/iandunn/8162246 pour contourner un besoin de mot de passe et ajouter ces fonctions à functions.php.

J'ai également déplacé le code de connexion automatique de 'init' au modèle où il s'exécute avant l'envoi des en-têtes ou la sortie du code HTML (au-dessus de wp_head ()).

Alors maintenant, ça ressemble à ça:

if (!is_user_logged_in()) :
    if (isset($_GET['user_redirect'])) :
    $user_login_string = intval($_GET['user_redirect']);
    /* Fancy user id retrieval stuff */ 
    $user_data = get_userdata($decrypted_user_id);
    if ($user_data) :
      $user_login = $user_data->user_login;
      $loggedin = programmatic_login( $user_login ); // <--- Gist function
      if ($loggedin) :
        wp_redirect('/userpage');
        exit();
      endif;
    endif;
  else :
    wp_redirect(wp_login_url());
    exit;
  endif;
endif;

Et ça marche, wie, yay, bonne danse.

1
Maija Vilkina