php - 自定义登录页面中的 WordPress 密码重置出现错误=无效键错误
问题描述
在我的 WordPress v5.7 中,我有自定义登录页面。
在代码下方接受密码重置请求并从自定义登录页面发送电子邮件。
add_filter("retrieve_password_message", "custom_password_reset", 99, 4);
function custom_password_reset($message, $key, $user_login, $user_data) {
$key = get_password_reset_key($user_data);
$message = sprintf(__('To reset password for %s, visit the following address:'), $user_data->user_email) . "\r\n\r\n";
$message .= site_url("wp-login.php?action=rp&key=$key&login=" . rawurlencode($user_login), 'login') . "\r\n\r\n";
return $message;
}
上面的代码生成以下 URL 并向用户发送电子邮件。
https://www.example.com/wp-login.php?action=rp&key=XVBzvTRG17rKaG4brjH6&login=user_name
以下是自定义密码重置页面中的表格:
<form name="resetpassform" id="resetpassform" action="<?php echo esc_url(network_site_url('wp-login.php?action=resetpass', 'login_post')); ?>" method="post" autocomplete="off">
<input type="hidden" id="user_login" value="<?php echo $_GET['login']; ?>" autocomplete="off" />
<input id="pass1" name="pass1" type="password" value="" placeholder="New Password" autocapitalize="off" data-reveal="1">
<input id="pass2" name="pass2" type="password" value="" placeholder="Confirm New Password" autocapitalize="off">
<input type="hidden" name="key" value="<?php echo $_GET['key']; ?>" />
<button type="submit" id="resetpass-button" name="submit">Save New Password</button>
</form>
下面的代码应该验证密钥+登录并重置密码:
function do_password_reset() {
if ('POST' == $_SERVER['REQUEST_METHOD']) {
$rp_key = $_REQUEST['rp_key'];
$rp_login = $_REQUEST['rp_login'];
$user = check_password_reset_key($rp_key, $rp_login);
if (!$user || is_wp_error($user)) {
if ($user && $user->get_error_code() === 'expired_key') {
wp_redirect(site_url('login/reset/?errors=expiredkey'));
} else {
wp_redirect(site_url('login/reset/?errors=invalidkey'));
}
exit;
}
if (isset($_POST['pass1'])) {
if ($_POST['pass1'] != $_POST['pass2']) {
// Passwords don't match
.....
}
if (empty($_POST['pass1'])) {
// Password is empty
.....
}
// Parameter checks OK, reset password
reset_password($user, $_POST['pass1']);
wp_redirect(site_url('login?password=changed'));
} else {
echo "Invalid request.";
}
exit;
}
}
add_action('login_form_rp', 'do_password_reset');
add_action('login_form_resetpass', 'do_password_reset');
用户无法从自定义登录页面重置密码并errors=invalidkey
出现错误。
解决方案
您的表单包含pass1
和pass2
作为成员,但是,您的后端分别期望rp_key
和rp_login
。因此,两者不兼容,导致您刚刚描述的不良行为。为了解决这个问题,您需要确保元素中的name
s与您在后端使用的键匹配,因此您需要相应地更改 s 或您提供给 $ 的键以获得他们。password
input
form
form
name
_REQUEST
推荐阅读
- c - 使用支持 FIPS 的 openssl 编译应用程序
- php - 发送电子邮件时出错 [Symfony mailerBundle]
- java - Camunda 用于存储数据
- javascript - 无法获取要在单元格中链接的日历事件 ID
- spring-boot - 带有小胡子和弹簧错误标签的错误消息
- javascript - 在 vue 中使用 jest 时无法编译但测试用例通过
- google-analytics - Google 跟踪代码管理器 - 事件未显示在 Google Analytics 实时事件选项卡中
- python - Python:由于路径问题,从命令行运行 appium 服务器失败
- ansible - 是否可以增加 apt_repository 模块的超时时间?
- mysql - 在 MySQL 数据库上操作字符串