संक्षिप्त परिचय
WP स्रोत कोड के अंदर त्वरित रूप से देखने के बाद, मुझे लगता है कि मुझे समाधान मिल गया है ...
वर्डप्रेस कुकीज़ को सेट और पार्स करने के लिए दो कार्यों का उपयोग करता है:
wp_generate_auth_cookie
wp_parse_auth_cookie
इसमें एक फिल्टर है wp_generate_auth_cookie
जिसे auth_cookie
आप कुकी की सामग्री को बदलने के लिए उपयोग कर सकते हैं, लेकिन अंदर कोई फिल्टर नहीं है wp_parse_auth_cookie
, लेकिन ...
इन दोनों कार्यों को pluggable.php में परिभाषित किया गया है, जिसका अर्थ है, कि आप उनके लिए अपने स्वयं के कार्यान्वयन लिख सकते हैं और डिफ़ॉल्ट को अधिलेखित कर सकते हैं।
समाधान
- अपना खुद का प्लगइन लिखें (चलो इसे बेहतर प्रामाणिक कुकी कहते हैं)
- इस प्लगइन के अंदर अपने खुद के
wp_generate_auth_cookie
और wp_parse_auth_cookie
कार्यों को लागू करें ।
- अपने प्लगइन को सक्रिय करें।
आप नीचे दिए गए इन कार्यों का मेरा नमूना कार्यान्वयन (मूल संस्करणों पर दृढ़ता से आधारित) पा सकते हैं:
if ( !function_exists('wp_generate_auth_cookie') ) :
/**
* Generate authentication cookie contents.
*
* @since 2.5.0
*
* @param int $user_id User ID
* @param int $expiration Cookie expiration in seconds
* @param string $scheme Optional. The cookie scheme to use: auth, secure_auth, or logged_in
* @param string $token User's session token to use for this cookie
* @return string Authentication cookie contents. Empty string if user does not exist.
*/
function wp_generate_auth_cookie( $user_id, $expiration, $scheme = 'auth', $token = '' ) {
$user = get_userdata($user_id);
if ( ! $user ) {
return '';
}
if ( ! $token ) {
$manager = WP_Session_Tokens::get_instance( $user_id );
$token = $manager->create( $expiration );
}
$pass_frag = substr($user->user_pass, 8, 4);
$key = wp_hash( $user->user_login . '|' . $pass_frag . '|' . $expiration . '|' . $token, $scheme );
// If ext/hash is not present, compat.php's hash_hmac() does not support sha256.
$algo = function_exists( 'hash' ) ? 'sha256' : 'sha1';
$hash = hash_hmac( $algo, $user->user_login . '|' . $expiration . '|' . $token, $key );
$cookie = $user_id . '|' . $expiration . '|' . $token . '|' . $hash;
/**
* Filter the authentication cookie.
*
* @since 2.5.0
*
* @param string $cookie Authentication cookie.
* @param int $user_id User ID.
* @param int $expiration Authentication cookie expiration in seconds.
* @param string $scheme Cookie scheme used. Accepts 'auth', 'secure_auth', or 'logged_in'.
* @param string $token User's session token used.
*/
return apply_filters( 'auth_cookie', $cookie, $user_id, $expiration, $scheme, $token );
}
endif;
if ( !function_exists('wp_parse_auth_cookie') ) :
/**
* Parse a cookie into its components
*
* @since 2.7.0
*
* @param string $cookie
* @param string $scheme Optional. The cookie scheme to use: auth, secure_auth, or logged_in
* @return array Authentication cookie components
*/
function wp_parse_auth_cookie($cookie = '', $scheme = '') {
if ( empty($cookie) ) {
switch ($scheme){
case 'auth':
$cookie_name = AUTH_COOKIE;
break;
case 'secure_auth':
$cookie_name = SECURE_AUTH_COOKIE;
break;
case "logged_in":
$cookie_name = LOGGED_IN_COOKIE;
break;
default:
if ( is_ssl() ) {
$cookie_name = SECURE_AUTH_COOKIE;
$scheme = 'secure_auth';
} else {
$cookie_name = AUTH_COOKIE;
$scheme = 'auth';
}
}
if ( empty($_COOKIE[$cookie_name]) )
return false;
$cookie = $_COOKIE[$cookie_name];
}
$cookie_elements = explode('|', $cookie);
if ( count( $cookie_elements ) !== 4 ) {
return false;
}
list( $user_id, $expiration, $token, $hmac ) = $cookie_elements;
$user = get_userdata($user_id);
$username = ( ! $user ) ? '' : $user->user_login;
return compact( 'username', 'expiration', 'token', 'hmac', 'scheme' );
}
endif;
इन कार्यों के मेरे संस्करण के user_login
साथ बदल जाता है user_id
। लेकिन इसे और भी अधिक जटिल (यानी उपयोगकर्ता विशिष्ट हैश, या ऐसा कुछ) के लिए इसे बदलने के लिए एक अच्छी शुरुआत होनी चाहिए।