我以 asp.net 形式工作,但此解决方案可适用于任何语言。过期令牌的问题很烦人。
令牌在 v3 中的有效时间为 2 分钟,但 google 不推荐每 2 分钟刷新一次令牌的计时器。他们建议仅在需要时刷新令牌。
我选择了 javascript 解决方案,强制客户端单击刷新令牌的按钮。
需要注意的是,如果在刷新 recaptcha 时执行了“recaptcha.ready”,则会引发错误,所以我必须将“ready”与“execute”分开,这样,recaptcha 就会被刷新而没有错误。
<script type="text/javascript" >
grecaptcha.ready(function () {
captcha_execute();
});
function captcha_execute() {
grecaptcha.execute('<%=System.Configuration.ConfigurationManager.AppSettings("recaptcha-public-key").ToString %>', { action: 'ingreso_usuario_ext' }).then(function (token) {
document.getElementById("g-recaptcha-response").value = token;
});
}
function los_dos(token_viejo) {
captcha_execute()
clase_boton(token_viejo);
}
async function clase_boton(token_viejo) {
btn_act = document.getElementById("Btn_Refrescar");
btn = document.getElementById("Btn_Ingresar");
btn.setAttribute("class", "button_gris");
btn_act.style.display = "none";
btn.style.display = "initial";
btn.disabled = true;
//token_viejo = document.getElementById("g-recaptcha-response").value;
strToken = token_viejo;
varCant = 0;
while (strToken == token_viejo && varCant < 30) {
strToken = document.getElementById("g-recaptcha-response").value;
await sleep(100);
varCant++;
}
btn.setAttribute("class", "button_azul");
btn.disabled = false;
setTimeout(refrescar_token, 120000);
}
function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
function refrescar_token() {
btn_ing = document.getElementById("Btn_Ingresar");
btn_act = document.getElementById("Btn_Refrescar");
btn_act.style.display = "initial";
btn_ing.style.display = "none";
}
</script>
在身体里
<body style="background-color: #dededc;" onload="clase_boton('');" >
纽扣
<asp:Button ID="Btn_Ingresar" runat="server" Text="Ingresar" CssClass="button_gris" Enabled="false" />
<input type="button" id="Btn_Refrescar" name="Btn_Refrescar" class="button_verde" value="Refrescar Token" title="Refrescar Token" onclick="los_dos(document.getElementById('g-recaptcha-response').value);" style="display: none;" />
使用 javascript,我等待令牌被填充,当它被填充时,我启用登录按钮。如果该过程花费的时间太长(由于某些错误),我仍然启用它。这是一个选择问题。
2 分钟后(“setTimeout”),登录按钮变得不可见,我显示了刷新令牌的按钮。
我希望这可以帮助/指导您解决问题。