我尝试实施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();
});
});
延迟编辑: 代码按预期工作,因为另一个模块搞乱了我们应用程序的本地存储而无法正常工作。
答案 0 :(得分:2)
这是因为,g-recaptcha防止了重复的条目。如果刷新页面并尝试验证它,它将从头开始验证。此外,如果数据存储在您的cookie中,则重新包装将不会开始新的验证。