我目前正在尝试构建一个自定义重置密码表单,在需要为用户验证密钥之前,该表单似乎运行良好:
//Redirect away from default wordpress to reset password
function redirect_to_reset_password() {
if ( \'GET\' == $_SERVER[\'REQUEST_METHOD\'] ) {
// Verify key / login combo
$user = check_password_reset_key( $_REQUEST[\'key\'], $_REQUEST[\'login\'] );
if ( ! $user || is_wp_error( $user ) ) {
if ( $user && $user->get_error_code() === \'expired_key\' ) {
wp_redirect( home_url( \'/login?login=expiredkey/\' ) );
} else {
wp_redirect( home_url( \'/login?login=invalidkey/\' ) );
}
exit;
}
$redirect_url = home_url( \'/reset-password/\' );
$redirect_url = add_query_arg( \'login\', esc_attr( $_REQUEST[\'login\'] ), $redirect_url );
$redirect_url = add_query_arg( \'key\', esc_attr( $_REQUEST[\'key\'] ), $redirect_url );
wp_redirect( $redirect_url );
exit;
}
}
add_action(\'login_form_rp\', \'redirect_to_reset_password\');
add_action(\'login_form_resetpass\', \'redirect_to_reset_password\');
//Make new password
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( home_url( \'/login?login=expiredkey/\' ) );
} else {
wp_redirect( home_url( \'/login?login=invalidkey/\' ) );
}
exit;
}
if ( isset( $_POST[\'pass1\'] ) ) {
if ( $_POST[\'pass1\'] != $_POST[\'pass2\'] ) {
// Passwords don\'t match
$redirect_url = home_url( \'/reset-password/\' );
$redirect_url = add_query_arg( \'key\', $rp_key, $redirect_url );
$redirect_url = add_query_arg( \'login\', $rp_login, $redirect_url );
$redirect_url = add_query_arg( \'error\', \'password_reset_mismatch\', $redirect_url );
wp_redirect( $redirect_url );
exit;
}
if ( empty( $_POST[\'pass1\'] ) ) {
// Password is empty
$redirect_url = home_url( \'/reset-password/\' );
$redirect_url = add_query_arg( \'key\', $rp_key, $redirect_url );
$redirect_url = add_query_arg( \'login\', $rp_login, $redirect_url );
$redirect_url = add_query_arg( \'error\', \'password_reset_empty\', $redirect_url );
wp_redirect( $redirect_url );
exit;
}
// Parameter checks OK, reset password
reset_password( $user, $_POST[\'pass1\'] );
wp_redirect( home_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\' );
我一直在四处寻找,试图找出问题的原因,我发现user\\u activation\\u key下的密钥与我在尝试重置密码时在URL中获得的密钥不同。E、 g:
数据库:1553346836:$P$BYEbftAGRfnhlBTeuNL4ylhsxRyhS3/
URL:key=dx1GjoJnaD6Dytc5zpNq
我假设这只是wordpress加密密钥的方式,所以不应该导致这个问题,但这是我能找到的唯一不一致之处。
编辑:如果我尝试检查$user设置为什么值,我会得到一个关于$_REQUEST[\'rp_key\']
和$_REQUEST[\'rp_login\']
. 然后,我尝试var\\u dump$\\u请求,这给了我以下信息:array(2) { ["login"]=> string(20) "[email protected]" ["key"]=> string(20) "nWrRCsRD4OvaROeMFErV" }
. 在此之后,我将$\\u REQUEST[\'rp\\u key\']更改为$\\u REQUEST[\'key\'],并将其用于登录,但仍然会出现相同的未定义索引错误。但是该值在$\\u请求数组中,为什么它找不到它?
我使用check_password_reset_key
两次对设置为无效的密钥有影响吗?
EDIT2:通过运行https的环境运行代码会导致“错误请求”返回。