セキュリティ上の目的で、ユーザーが(WordPress経由で)ログインし、最大15分のセッションでログインしたままでいることを可能にする小さなWebアプリケーションがあります。ほとんどのセッションは長持ちするため、HTML文書自体をクリックするたびに小さなAjax呼び出しが行われます。
Ajax呼び出し自体が/admin-ajax.php
ファイルを起動し、(functions.php内の)関数にヒットします。以下がその機能です。
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();
}
wp_set_auth_cookie()
は大変な仕事をします。それは正しく(各クリックで)15分間の延長セッションを可能にします。問題は、誰かがログアウトしようとした場合です。現在のログアウトリンクはwp_logout_url()
を介してエコー表示されますが、そのログアウトURLはWordPressによって作成された瞬間から一瞬しかありません。
それで、上記の関数で、私は新しいログアウトURLを生成しています(そしてWPコアコードから、これは新しいクッキーからセッショントークンを取得することによって生成されるようです)、しかしlogout urlは、Wordpress Failure Noticeページにnonceの不一致を示します。私は今までも$expected
と$nonce
のwp_verify_nonce()
関数をチェックするために(hash_equals()
のために)pluggable.phpからコードをコピーすることさえしました、そしてそれらは同等です。まだ私はまだ一回限りのエラーが出ます。
誰もがこれらのエラーを回避するために新しい一回だけを設定しながら、新しいauth/logging_inクッキーを設定する方法を知っていますか?
あなたの問題は、あなたがwp_logout_url
の直後にwp_set_auth_cookie
を呼び出すことです。
wp_set_auth_cookie()
はいくつかのsetcookie()
呼び出しを行います。残念ながら、setcookie
はPHP global $_COOKIE
で新しい値を即座に利用可能にしません。最初に新しいHTTPリクエストを通じて設定する必要があります。
wp_logout_url()
(wp_nonce_url
> wp_create_nonce
> wp_get_session_token
> wp_parse_auth_cookie
による)は有効な一回だけを作成するために$_COOKIE[LOGGED_IN_COOKIE]
を取り出します。ログインしたクッキーが既に更新されていることを知らないで。 (これをWPコアバグと呼ぶことができるかどうかはよくわかりません。)
wp_set_auth_cookie
にはset_logged_in_cookie
という名前のアクションフックがあります。これにより、ajaxリクエスト中にセッションクッキーの値を更新できるようになります。
function my_update_cookie( $logged_in_cookie ){
$_COOKIE[LOGGED_IN_COOKIE] = $logged_in_cookie;
}
add_action( 'set_logged_in_cookie', 'my_update_cookie' );