ReCaptcha 2只工作一次

时间:2017-09-01 14:00:30

标签: javascript recaptcha

我尝试实施ReCaptcha,但在我测试时,我只能获得一次有效的 g-recaptcha-response 。如果我第二次尝试验证验证码,我会选中框#34;我不是机器人"然后解决挑战,但我第一次得到完全相同的 g-recaptcha-response ,我得到一个"超时或重复"来自网络服务https://www.google.com/recaptcha/api/siteverify的错误。

我能让它再次工作的唯一方法是清空我的本地存储空间和我的cookie。 你知道我为什么要这么做吗?

我的代码如下:

HTML:

<div class="g-recaptcha"></div>

JS:

class CaptchaProtectedForm {
    onSubmit() {
        const captchaContainer = document.querySelector('.g-recaptcha');
        this.captchaWidgetId = global.grecaptcha.render(capContainer, {
            sitekey: '{site key}',
            callback: this.doSubmit.bind(this),
        });
    }

    doSubmit() {
        const response = global.grecaptcha.getResponse(this.captchaWidgetId);
        this.callBackend(parameters, response);
        global.grecaptcha.reset();
    }
}

后端代码(快速路由器):

router.route('/captchaProtectedEndpoint').post((req, res) => {
    const {
        headers: {
            'x-captcha-token': captchaToken,
            'x-forwarded-for': forwardedIp,
        },
    } = req;

    const requestData = {
        secret: conf.captchaSecretKey,
        response: captchaToken,
        remoteip: forwardedIp || req.connection.remoteAddress,
    };

    const requestConfig = {
        uri: 'https://www.google.com/recaptcha/api/siteverify',
        method: 'POST',
        form: requestData,
    };

    request(requestConfig)
        .then((captchaResponse) => {
            if (captchaResponse.success) {
                console.log('success', captchaResponse);
                res.status(200).send();
            } else {
                console.log('failure', captchaResponse);
                res.status(403).send();
            }
        })
        .catch((err) => {
            res.status(500).send();
        });

});

延迟编辑: 代码按预期工作,因为另一个模块搞乱了我们应用程序的本地存储而无法正常工作。

1 个答案:

答案 0 :(得分:2)

这是因为,g-recaptcha防止了重复的条目。如果刷新页面并尝试验证它,它将从头开始验证。此外,如果数据存储在您的cookie中,则重新包装将不会开始新的验证。