web-dev-qa-db-fra.com

Étendre la session et le nonce Wordpress (4.x)

Nous avons une petite application Web qui permet aux utilisateurs de se connecter (via WordPress) et de rester connecté pendant une session maximale de 15 minutes à des fins de sécurité. Étant donné que la plupart des sessions dureront plus longtemps, j'ai un petit appel ajax effectué à chaque clic du document html lui-même.

L'appel ajax lui-même se déclenche dans le fichier /admin-ajax.php et déclenche une fonction (dans functions.php). Ci-dessous, cette fonction:

function extend_my_session_yo(){
    $user_id = get_current_user_id();
    wp_set_auth_cookie($user_id, false, true);

    $new_logout = wp_logout_url();

    if ( is_user_logged_in() ) {
        echo 'session extended 15 mins ' . $new_logout;
    } 
    // if a user is *not* logged in, Wordpress just outputs a "0". 
    die();
}

La wp_set_auth_cookie() fait le travail difficile. Il permet correctement (sur chaque clic) une session étendue de 15 minutes. Le problème est que si quelqu'un essaie de se déconnecter. Le lien de déconnexion actuel est répercuté via wp_logout_url(), mais cette URL de déconnexion a un nonce à partir du moment où elle est créée par WordPress.

Ainsi, dans la fonction ci-dessus, je génère une nouvelle URL de déconnexion (et à partir du code principal WP, il semble que cela soit généré en récupérant le jeton de session depuis le nouveau cookie), mais chaque clic sur le nouveau url de déconnexion affiche la page Avis d’échec de Wordpress indiquant une non correspondance. Je suis même allé jusqu'à copier le code de pluggable.php (pour wp_verify_nonce()) pour vérifier la fonction hash_equals() pour $expected vs $nonce et ils sont égaux. Pourtant, je reçois toujours des erreurs nonce.

Est-ce que quelqu'un sait comment définir un nouveau cookie auth/log_in tout en définissant un nouveau nonce pour éviter ces erreurs?

6
MikeTT

Votre problème est que vous appelez wp_logout_url immédiatement après wp_set_auth_cookie.

wp_set_auth_cookie() effectue des appels setcookie(). Malheureusement, setcookie ne rend pas la nouvelle valeur disponible instantanément dans le PHP global $_COOKIE. Il doit d'abord être défini via une nouvelle requête HTTP.

wp_logout_url() (via wp_nonce_url> wp_create_nonce> wp_get_session_token> wp_parse_auth_cookie) extrait $_COOKIE[LOGGED_IN_COOKIE] afin de créer un nonce valide, ne sachant pas que le cookie de connexion a déjà été mis à jour. (Je ne suis pas tout à fait sûr que nous puissions appeler cela un bug principal WP.)

Il existe un crochet d'action dans wp_set_auth_cookie nommé set_logged_in_cookie, ce qui devrait vous permettre de mettre à jour la valeur du cookie de session pendant votre demande ajax.

function my_update_cookie( $logged_in_cookie ){
    $_COOKIE[LOGGED_IN_COOKIE] = $logged_in_cookie;
}
add_action( 'set_logged_in_cookie', 'my_update_cookie' );
5
Jörn Lund