集成reCAPTCHA和wp_SignOn-需要什么?

时间:2020-03-26 作者:bestprogrammerintheworld

我一直在使用wp_signon 长期在项目中:

//Do the actual login for WP User
$creds = array();
$creds[\'user_login\'] = $skuser_name;
$creds[\'user_password\'] = $skuser_pass;
$creds[\'remember\'] = true;
$user = wp_signon( $creds, false ); 
这已经起作用很长时间了。我最近添加了插件Wordfence,其中包括用于登录和注册表单的recaptcha(invislbe),这些插件显然可以工作。

After installation of that plugin 我的自定义loginforms和上面的代码没有not 工作经过一番研究,我发现是recaptcha与我的自定义登录表单结合使用wp_signon 这就是问题所在。

I get the error (使用正确的用户名和密码时):

//需要验证:登录需要额外验证。请检查与帐户关联的电子邮件地址以获取验证链接。

When I deactive recaptcha which is included in WordFence - plugin -> my custom loginform does work.

我有实际的recaptcha所需的钥匙,但我不知道what I have to do to 将此集成到wp_signon!? 是否可以将recaptcha与wp_signon 还是必须创建自定义wp\\U登录函数?

请给我指出正确的方向!非常感谢。

1 个回复
最合适的回答,由SO网友:Sally CJ 整理而成

所以Wordfence 使用JavaScript将验证码字段添加到登录/注册表单中,但默认情况下仅在https://example.com/wp-login.php.

如果要将字段添加到表单中,或将CAPTCHA安全性与自定义登录表单集成,请执行以下步骤:

将(重新)验证码脚本排队,最好仅在具有自定义表单的页面上:

add_action( \'wp_enqueue_scripts\', function () {
    if ( is_page( \'my-page\' ) &&
        class_exists( \'\\WordfenceLS\\Controller_WordfenceLS\' )
    ) {
        \\WordfenceLS\\Controller_WordfenceLS::shared()->_login_enqueue_scripts();
    }
} );
以上内容将仅在my-page 页,因此您应该更改slug或使用另一个条件标记,如is_single().

您的自定义表单必须满足以下条件:

用户名字段必须命名log (例如。<input name="log" />).

密码字段必须命名pwd (例如。<input name="pwd" />).

“提交”按钮的id 必须是wp-submit (例如。<input id="wp-submit" type="submit" />).

不得有其他表单包含这些字段,即不得有其他表单字段包含same name or id.

Wordfence将运行AJAX请求来检查凭据,当出现错误(如密码错误)时,Wordfence将在h1 (标题级别1)在元素内部id 属于login.

所以你需要确保这两个要素(#login#login > h1) 两者都存在&mdash;请参见下面的示例表单代码。

不幸的是,这些都是Wordfence自定义登录脚本中的限制,您可以在wp-content/plugins/wordfence/modules/login-security/js 文件名如下所示login.1581523568.js (即。login.<numbers>.js). 您可以复制和修改脚本(即删除这5个限制),然后将其排入队列,而不是默认值,但您需要自己尝试这样做。

此外,如果您使用wp_login_form() (带有自定义action 值),您只需要添加上面#5中提到的元素。

Code I used for testing:

表单,如所示https://example.com/my-page/:

<div id="login">
    <h1>Login</h1>

    <!-- Wordfence places AJAX error here -->

    <form method="post" action="">
        <input name="log" type="text" placeholder="Username" />
        <input name="pwd" type="password" placeholder="Password" />

        <input type="hidden" name="action" value="my_login" />
        <?php wp_nonce_field( \'my-login\' ); ?>

        <input type="submit" id="wp-submit" />
    </form>
</div>
PHP调用wp_signon():

add_action( \'init\', function () {
    if (
        wp_doing_ajax() || empty( $_POST[\'_wpnonce\'] ) ||
        ( ! ( isset( $_POST[\'log\'], $_POST[\'pwd\'] ) ) ) ||
        ! wp_verify_nonce( $_POST[\'_wpnonce\'], \'my-login\' )
    ) {
        return;
    }

    $creds = array();

    $creds[\'user_login\']    = $_POST[\'log\'];
    $creds[\'user_password\'] = $_POST[\'pwd\'];
    $creds[\'remember\']      = true;

    $user = wp_signon( $creds, false );
    if ( is_wp_error( $user ) ) {
        wp_die( $user );
    } else {
        wp_redirect( home_url( wp_get_referer() ) );
        exit;
    }
} );

附加注释

如我在评论中所述,如果您只想在执行以下操作时绕过验证码验证wp_signon(), 您可以使用wordfence_ls_require_captcha filter:

add_filter( \'wordfence_ls_require_captcha\', \'__return_false\' );
// call wp_signon() here
remove_filter( \'wordfence_ls_require_captcha\', \'__return_false\' );

相关推荐

bloginfo url in javascript

我正在试着设置<?php bloginfo(\'template_url\'); ?> 在Javascript上的变量中,然后设置src 的img 元素,但在html中它被打印为src=\"<?php bloginfo(\'template_url\'); ?>\" 事实上url.我就是这样做的:var wpTemplateUrl = \"<?php bloginfo(\'template_url\'); ?>\"; primaryImg.src = wpTem