[英]WordPress password reset in custom login page getting errors=invalidkey error
[英]errors=invalidkey for a WordPress Custom Password recovery page
WordPress v5.4.1,我有以下代碼從自定義頁面發送密碼重置郵件。
// Custom message
function replace_retrieve_password_message($message, $key, $user_login, $user_data) {
global $wpdb;
$key = $wpdb->get_var("SELECT user_activation_key FROM $wpdb->users WHERE user_login ='" . $user_login . "'");
if (empty($key)) {
//generate reset key
$key = wp_generate_password(20, false);
$wpdb->update($wpdb->users, array('user_activation_key' => $key), array('user_login' => $user_login));
}
// Create new message
$msg = __('Hello!') . "\r\n\r\n";
$msg .= sprintf(__('You asked us to reset your password for your account using the email address %s.'), $user_login) . "\r\n\r\n";
$msg .= __("If this was a mistake, or you didn't ask for a password reset, just ignore this email and nothing will happen.") . "\r\n\r\n";
$msg .= __('To reset your password, visit the following address:') . "\r\n\r\n";
$msg .= site_url("wp-login.php?action=rp&key=$key&login=" . rawurlencode($user_login), 'login') . "\r\n\r\n";
$msg .= __('Thanks!') . "\r\n";
return $msg;
}
add_filter('retrieve_password_message', 'replace_retrieve_password_message', 10, 4);
用戶正在獲取密碼重置 email 並在單擊鏈接時給出errors=invalidkey
。
我嘗試刪除自定義$key
function 以生成 WordPress 默認密鑰。 然后我將有密碼重置頁面,但任何操作都顯示errors=invalidkey
。
你為什么要重新生成$key
? 為什么不只使用傳遞給您的回調的那個?
但是如果你必須重新生成它,那么你可以只使用get_password_reset_key()
:
$key = get_password_reset_key( $user_data );
您的invalidkey
錯誤的原因是您只是在創建隨機密碼並按原樣使用它。 要使其成為有效的重置密鑰,需要對其進行哈希處理。
參考: https://core.trac.wordpress.org/browser/tags/5.4/src/wp-includes/user.php#L2316
因此,如果您想使用您的方法,您只需要像這樣 hash 您的密鑰,
// Custom message
function replace_retrieve_password_message($message, $key, $user_login, $user_data) {
global $wpdb;
global $wp_hasher;
$key = $wpdb->get_var("SELECT user_activation_key FROM $wpdb->users WHERE user_login ='" . $user_login . "'");
if (empty($key)) {
//generate reset key
$key = wp_generate_password(20, false);
if ( empty( $wp_hasher ) ) {
require_once ABSPATH . WPINC . '/class-phpass.php';
$wp_hasher = new PasswordHash( 8, true );
}
$key = time() . ':' . $wp_hasher->HashPassword( $key );
$wpdb->update($wpdb->users, array('user_activation_key' => $key), array('user_login' => $user_login));
}
// Create new message
$msg = __('Hello!') . "\r\n\r\n";
$msg .= sprintf(__('You asked us to reset your password for your account using the email address %s.'), $user_login) . "\r\n\r\n";
$msg .= __("If this was a mistake, or you didn't ask for a password reset, just ignore this email and nothing will happen.") . "\r\n\r\n";
$msg .= __('To reset your password, visit the following address:') . "\r\n\r\n";
$msg .= site_url("wp-login.php?action=rp&key=$key&login=" . rawurlencode($user_login), 'login') . "\r\n\r\n";
$msg .= __('Thanks!') . "\r\n";
return $msg;
}
add_filter('retrieve_password_message', 'replace_retrieve_password_message', 10, 4);
但我寫這個只是為了讓你理解這個問題。 我不推薦它。
推薦方法:
正如另一個答案也表明正確的方法是跳過您手動執行的所有密鑰創建並為此使用正確的 function 即get_password_reset_key()
,因此您使用這種方法的代碼看起來像,
// Custom message
function replace_retrieve_password_message($message, $key, $user_login, $user_data) {
$key = get_password_reset_key( $user_data );
// Create new message
$msg = __('Hello!') . "\r\n\r\n";
$msg .= sprintf(__('You asked us to reset your password for your account using the email address %s.'), $user_login) . "\r\n\r\n";
$msg .= __("If this was a mistake, or you didn't ask for a password reset, just ignore this email and nothing will happen.") . "\r\n\r\n";
$msg .= __('To reset your password, visit the following address:') . "\r\n\r\n";
$msg .= site_url("wp-login.php?action=rp&key=$key&login=" . rawurlencode($user_login), 'login') . "\r\n\r\n";
$msg .= __('Thanks!') . "\r\n";
return $msg;
}
add_filter('retrieve_password_message', 'replace_retrieve_password_message', 10, 4);
如您所見,它更清潔。 最好在可用且適用的情況下使用現有功能。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.