WordPress重置密码返回无效密钥

时间:2019-03-27 作者:ok34332

我目前正在尝试构建一个自定义重置密码表单,在需要为用户验证密钥之前,该表单似乎运行良好:

//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的环境运行代码会导致“错误请求”返回。

2 个回复
SO网友:Andrew

我也有同样的问题,我想你是根据这个指南工作的-https://code.tutsplus.com/tutorials/build-a-custom-wordpress-user-flow-part-3-password-reset--cms-23811

查看实际的重置密码表单,其中显示pass1和pass2。隐藏字段值将自动设置为$attribute[\'key\']$attribute[\'login\'].

将此更改为$_REQUEST[\'key\']$_REQUEST[\'login\'] 应该解决这个问题。

希望这有帮助。

SO网友:MikeNGarrett

我认为这里的问题在于$_REQUEST 而不是明确地寻找GETPOST 变量。

我认为您已经解决了第一个问题,即流程的第一步(您请求重置)通过了keylogin 通过$_GET 变量。这允许redirect_to_reset_password() 适当重定向。

下一部分略有不同。重置密码表单传递以下内容:

Array (
    [action] => resetpass
    [pass1] => [text]
    [pass1-text] => [text]
    [pass2] => [text]
    [rp_key] => [text]
    [wp-submit] => Reset Password
)
除非您正在从/reset-password/rp_login 将永远不会设置。wp-login.php shows a different process 检索要运行的必要部件check_password_reset_key()

if ( isset( $_COOKIE[ $rp_cookie ] ) && 0 < strpos( $_COOKIE[ $rp_cookie ], \':\' ) ) {
        list( $rp_login, $rp_key ) = explode( \':\', wp_unslash( $_COOKIE[ $rp_cookie ] ), 2 );
        $user                      = check_password_reset_key( $rp_key, $rp_login );
        if ( isset( $_POST[\'pass1\'] ) && ! hash_equals( $rp_key, $_POST[\'rp_key\'] ) ) {
            $user = false;
        }
}
你可以看到它正在检查rp_cookie 这是在过程的早期设置的。从这里检索登录名和密钥,然后根据通过POST 变量

你需要做一些类似的事情来完成这项工作。

相关推荐

Can't alter $lostpassword_url

我需要更改“检索密码”的href,但我似乎无法更改$lostpassword_url 在里面wp_lostpassword_url();我有一个过滤器,它显然被调用了wp-login.php:function wp_lostpassword_url( $redirect = \'\' ) { $args = array( \'action\' => \'lostpassword\' ); if ( !empty($redirect) ) { $