Fel*_*Fel 4 angular recaptcha-v3
我想保护注册页面免受自动提交,所以我决定尝试 reCaptcha v3。这是一个 Angular 应用程序,我使用ng-recaptcha模块来更轻松地集成。我已经在 Stackblitz 上设置了一个基本示例,因此您可以在线测试它:
https://stackblitz.com/edit/angular-qk3jhr
我有几个疑问/问题:
app.module.ts文件,当我按下提交按钮时,该this.recaptchaV3Service.execute调用将不执行任何操作。是因为该应用程序不在我在生成 reCaptcha V3 密钥时指定的域中吗?另外,如果我写错了密钥,Google 会抱怨以下错误:错误:无效的站点密钥或未在 api.js 中加载:
提前致谢,
Fel*_*Fel 12
最后,我有时间尝试一些事情,并设法让它发挥作用。基本上,我所做的是:
1 生成一对用于测试的密钥(在域中设置“localhost”)。
2 在客户端应用程序中,我已经ng-recaptcha按照其页面 ( https://www.npmjs.com/package/ng-recaptcha#recaptcha-v3-usage-see-in-action ) 中的说明设置了模块。然后,从用户注册组件(我想保护它),我在按下“提交”按钮时运行以下代码:
public beforeSubmittingForm(): void {
this.recaptchaV3Service.execute('registerSubmit').subscribe(
(token) => {
// 'this.user' contains the data of the user we want to create. Add the received token
this.user.recaptchav3_token = token;
this.submitForm(); // This sends the user data to the backend
},
(error) => {
this.errors = [ 'Error trying to verify request (reCaptcha v3)' ];
});
}
Run Code Online (Sandbox Code Playgroud)
3 在后端,在用户注册路径中,我使用axios库 ( https://www.npmjs.com/package/axios ) 使用收到的令牌向 Google 验证服务发出 POST 请求:
try {
var result = await axios.post("https://www.google.com/recaptcha/api/siteverify", {}, {
params: {
secret: recaptcha_api_key, // Secret API key
response: req.body.recaptchav3_token // Received token from the frontend
}
});
if(result.score < 0.5) {
return res.status(403).json({ msg: 'Google Recaptcha error' });
}
} catch(e) {
return res.status(403).json({ msg: 'Error trying to verify the request' });
}
// Continue with the registration process...
Run Code Online (Sandbox Code Playgroud)
希望能帮到你,加油!
小智 2
我不确定我是否理解第一个问题。如果您使用无效密钥,则预计您会收到该错误。如果您对正确的域使用正确的密钥,则应该生成令牌。
对于第二个问题...在这种情况下确实不需要生成令牌,ngOnInit()因为您在方法中生成了令牌preSubmitForm(),这就足够了。至于如何处理令牌,您需要将其与其余表单数据一起发布到您的服务器。然后,在处理表单提交的服务器端代码中,向 recaptcha API 发出请求,提供令牌和您的密钥。
查看有关服务器端验证的Google reCaptcha 文档。
| 归档时间: |
|
| 查看次数: |
14742 次 |
| 最近记录: |